2016-08-24 4 views
1

swypeでNSKeyedArchiverを使用して任意のクラスの配列(たとえば、array = SymptomsModel)をデバイスに保存します。NSKeyedArchiver swiftを使用して複雑なArrayオブジェクトをデバイスに保存する方法

私はSymptomsModelクラスは、プリミティブデータ型を持つすべての変数が含まれている場合は、配列を保存する方法を知っているが、あればそれを保存する方法がわからない、また、そのプロパティとして他のクラスの配列を含んで

以下は私がしています例の助けを借りて私の問題を説明し、それを通過して解決策を提供してください。 私はここで

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

としてNskeyedArchiverでデータを保存し、するクラス

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クラスは保存して、ここで配列

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

をretreivingの私implimentationである必要がありスラッグの価値を得ることはできますが、イメージの価値を取り出すことはできません。 slugがString型で、ImagesがCustom Class型のために発生している可能性があります。 私はそれが完了できる方法を提案してください。 これらのタイプの配列をNSKeyedArchiverで保存することができます。これにより、デバイスからArraySymptomを取得するだけでイメージ値にアクセスできます。

答えて

2

愚かな間違いそれは間違ったキーで復号したので、私はイメージでは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)as? [Sym_videos]

+0

こんにちは、preetiさん、ビデオのためにarchiver.encodeObject(videos、forKey:Keys.Videos)を使用しましたか? – ChanWarde

+0

@ChanWardeこのためにarchiver.encodeObjectを使用しました –

+0

ありがとうPreeti私はこれを解決しました。 – ChanWarde

関連する問題