2016-08-24 42 views
1

我想用swift中的NSKeyedArchiver将任何类的数组(例如let array = SymptomsModel)保存到设备中。如何使用NSKeyedArchiver将复杂的Arrayobjects保存到设备swift

我懂得,如果SymptomsModel类包含原始数据类型的所有变量保存一个数组,但不知道如何保存它,如果还包含其他类的数组作为其财产

下面我有以示例的方式解释我的问题,请通过它并提供解决方案。 我有一个类

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)") 
     }    
    } 

这里的执行力度我能够获得slu value的价值,但无法获取图像价值。 可能会发生这种情况,因为slug是字符串类型,Images是Custom Class类型。 请告诉我我可以完成的方式。 是否可以使用NSKeyedArchiver保存这些类型的数组,以便我可以通过从设备中检索ArraySymptom来访问图像值。

回答

2

愚蠢的错误是

我在形象越来越为零,因为它是用错了钥匙解码,它是复制粘贴错误

错误是在此功能..

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)as? [Sym_images]

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

+0

嗨,你刚刚用过视频archiver.encodeObject(视频,forKey:Keys.Videos)或添加任何视频本身的存档? – ChanWarde

+0

@ChanWarde我用这个 –

+0

archiver.encodeObject谢谢Preeti我解决了这个问题。 – ChanWarde

相关问题