2016-08-24 3 views
1

Я хочу сохранить массив любого класса (например, пусть array = SymptomsModel) на устройство, используя NSKeyedArchiver в swift.Как сэкономить сложные объекты Array на устройстве с помощью NSKeyedArchiver 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 
    } 
} 

И вот мой implimentation экономии, а затем retreiving массив

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 с устройства.

ответ

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) как? [Sym_videos]

+0

Привет Прити, вы просто использовали archiver.encodeObject (видео, forKey: Keys.Videos) для видео или добавить любой архиватор для самого видео ?? – ChanWarde

+0

@ChanWarde Я использовал archiver.encodeObject для этого –

+0

Спасибо Preeti Я решил это. – ChanWarde

 Смежные вопросы

  • Нет связанных вопросов^_^