【问题标题】:How to Save complex Arrayobjects to device using NSKeyedArchiver swift如何使用 NSKeyedArchiver swift 将复杂的 Arrayobjects 保存到设备
【发布时间】:2016-08-24 07:21:30
【问题描述】:

我想在 swift 中使用 NSKeyedArchiver 将任何类(例如,让数组 = 症状模型)类型的数组保存到设备中。

如果SymbolsModel类包含所有原始数据类型的变量,我知道如何保存数组,但如果还包含任何其他类的数组作为其属性,我不知道如何保存

下面我已经在示例的帮助下解释了我的问题,请仔细阅读并提供解决方案。 我有课

class SymptomsModel: NSObject, NSCoding ,ResponseJSONObjectSerializable   {
            var slug:String?
            var name:String?
            var images:[Sym_images]?
            var videos:[Sym_videos]?

    struct Keys {
            static let Name = "name"
            static let Slug = "slug"
            static let Images = "images"
            static let Videos = "videos"
         }

     required init(json:SwiftyJSON.JSON) {
         self.slug = json["slug"].string
         self.name = json["name"].string

         self.images = [Sym_images]()
         if let imagesJSON = json["images"].array {
                for(imagesJSON) in imagesJSON {
                    if let newImages = Sym_images(json: imagesJSON){
                        self.images?.append(newImages)
                    }
                }

          }

          self.videos = [Sym_videos]()
          if let videosJSONArray = json["videos"].array {

                for(videosJSON) in videosJSONArray {
                    if let newVideos = Sym_videos(json: videosJSON){
                        self.videos?.append(newVideos)
                    }
                }

           }
       }


  init(dictionary: [String : AnyObject]) {
     self.name = dictionary[Keys.Name] as? String
     self.slug = dictionary[Keys.Slug] as? String
     self.images = dictionary[Keys.Images] as? [Sym_acc_images_objects]

     self.videos = dictionary[Keys.Videos] as? [Sym_acc_videos_objects]

   }
func encodeWithCoder(archiver: NSCoder) {
    archiver.encodeObject(name, forKey: Keys.Name)
    archiver.encodeObject(slug, forKey: Keys.Slug)

    archiver.encodeObject(images, forKey: Keys.Images)
    archiver.encodeObject(videos, forKey: Keys.Videos)
}
required init(coder unarchiver: NSCoder) {
    super.init()
    name = unarchiver.decodeObjectForKey(Keys.Name) as? String
    slug = unarchiver.decodeObjectForKey(Keys.Slug) as? String
    self.images =  unarchiver.decodeObjectForKey(Keys.Slug) as? [Sym_acc_images_objects]
    self.videos =  unarchiver.decodeObjectForKey(Keys.Slug) as? [Sym_acc_videos_objects]
   }

还有一个 PersistanceManager 类,用 NskeyedArchiver 将数据保存为

    class PersistenceManager {

    class private func documentsDirectory() -> NSString {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let documentDirectory = paths[0] as String
        return documentDirectory
    }

    class func saveNSArray(arrayToSave: NSArray, key: String) {
        print(" saveNSArray key : \(key)")
        let file = documentsDirectory().stringByAppendingPathComponent(key)
        NSKeyedArchiver.archiveRootObject(arrayToSave, toFile: file)

    }

    class func loadNSArray(path: String) -> NSArray? {
        print(" loadNSArray key : \(path)")
        let file = documentsDirectory().stringByAppendingPathComponent(path)
        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(file)
        return result as? NSArray
    }
}

这是我保存然后检索数组的实现

class ViewController: UIViewController{
  var ArraySymptom = [SymptomsModel]()

  override func viewDidLoad() {
    super.viewDidLoad()
    ArraySymptom = loadArray()

    //saving data in device
    PersistenceManager.saveNSArray(ArraySymptom, key: "Symptom")


   //loading data from device
       if let value = PersistenceManager.loadNSArray("Symptom") as? [SymptomsModel]  {
            let images = value[0].images
            print("images : \(images)")
            let slug = value[0].slug
            print("slug : \(slug)")
       }              
  }

这里可以获取 slug 的值,但无法获取图像值。 这可能是因为 slug 是 String 类型而 Images 是 Custom Class 类型。 请建议我如何完成它。 是否可以使用 NSKeyedArchiver 保存这些类型的数组,这样我就可以通过从设备中检索 ArraySymptom 来访问图像值。

【问题讨论】:

    标签: arrays swift nscoding nskeyedarchiver


    【解决方案1】:

    这是个愚蠢的错误

    我在图像中得到了 nil,因为它是用错误的密钥解码的,这是复制粘贴错误

    错误在这个函数中..

    required init(coder unarchiver: NSCoder) {
    super.init()
    name = unarchiver.decodeObjectForKey(Keys.Name) as? String
    slug = unarchiver.decodeObjectForKey(Keys.Slug) as? String
    self.images =  unarchiver.decodeObjectForKey(Keys.Slug) as? [Sym_images]
    self.videos =  unarchiver.decodeObjectForKey(Keys.Slug) as? [Sym_videos]
    

    }

    而且正确的解码一定是

    self.images = unarchiver.decodeObjectForKey(Keys.Images) 作为? [Sym_images]

    self.videos = unarchiver.decodeObjectForKey(Keys.Videos) 作为? [Sym_videos]

    【讨论】:

    • 嗨 preeti,您是刚刚使用 archiver.encodeObject(videos, forKey: Keys.Videos) 视频还是为视频本身添加了任何存档器??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多