2014-11-21 77 views
1

我想使用NSKeyedUnarchiver類來解壓我的自定義對象,並不斷收到錯誤。NSCoding在Swift中不工作

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (HelloAppleWatch.Note)' 

用於說明類的代碼如下所示:

import UIKit 

class Note: NSObject,NSCoding { 

    var title :String? 

    override init() {} 

    required init(coder aDecoder: NSCoder) { 

     self.title = aDecoder.decodeObjectForKey("title") as String? 

    } 

    func encodeWithCoder(aCoder: NSCoder) { 

     aCoder.encodeObject(self.title, forKey: "title") 
    } 

} 

用於取消歸檔的代碼如下所示:

let savedData = NSData(contentsOfURL: newURL) 
      let note = NSKeyedUnarchiver.unarchiveObjectWithData(savedData!) as Note? 

UPDATE:

func createNote() { 

     let note = Note() 
     note.title = self.noteTextField?.text 

     // archive the note object 

     let fileCoordinator = NSFileCoordinator(filePresenter: self) 

     fileCoordinator.coordinateWritingItemAtURL(presentedItemURL!, options: nil, error: nil) { (newURL :NSURL!) -> Void in 

      let saveData = NSKeyedArchiver.archivedDataWithRootObject(note) 
      let success = saveData.writeToURL(newURL, atomically: true) 

     } 


    } 

奇怪的是,當unarchive decodeObjectForKey被觸發時,它甚至不會去執行Note.swift類。

+2

你是如何編碼'savedData'? – rintaro 2014-11-21 15:23:44

+0

更新了代碼以反映savedData。 – 2014-11-21 15:30:02

+0

看起來寫入可能會失敗,讀取時會導致零長度數據。有兩件事很值得了解:(1)你如何獲得你正在使用的URL,它的路徑是什麼? (2)當你調用'writeToURL'時,'success'的值是多少? – 2014-11-21 19:01:48

回答

1

您的NSCoding代碼看起來不錯,但是您的歸檔方法與我的看起來不一樣。嘗試使用此代碼示例來存檔您的數據。下面是我使用的代碼示例存儲我已經在迅速

func saveCustomData(data : NSMutableArray) 
    { 
     var filemgr : NSFileManager 
     var docsDir : String 
     var dirPaths : NSArray 

     filemgr = NSFileManager.defaultManager() 

     dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
     docsDir = dirPaths[0] as NSString 
     var dataFilePath = docsDir.stringByAppendingPathComponent("data.archive") 

     NSKeyedArchiver.archiveRootObject(data, toFile: dataFilePath) 
    } 

創建然後當你想解除封存,使用此

func loadCustomData() -> NSMutableArray 
    { 
     var filemgr : NSFileManager 
     var docsDir : String 
     var dirPaths : NSArray 

     filemgr = NSFileManager.defaultManager() 
     dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
     docsDir = dirPaths[0] as NSString 

     var dataFilePath = docsDir.stringByAppendingPathComponent("data.archive") 
     if(filemgr.fileExistsAtPath(dataFilePath)) 
     { 
      var journeyData = NSKeyedUnarchiver.unarchiveObjectWithFile(dataFilePath) as NSMutableArray 
      return journeyData 
     } 
     else 
     { 
      var emptyArray = NSMutableArray() 
      return NSMutableArray() 
     } 
    } 

希望幫助一個自定義類的mutablearray,如果你有任何問題,隨時問

+0

謝謝!我使用NSFileCoordinator出於不同的原因,這就是爲什麼我的存檔代碼是不同的。 – 2014-11-21 15:39:26