2017-07-24 91 views
0

在將MyClass拖出框架之前,我可以將MyClass的實例保存到Core Data中。導入爲框架後,NSKeyedUnarchiver decodeObjectForKey崩潰

這裏是MyClass實現:

open class MyClass: NSObject, NSCoding { 
    required public init?(coder aDecoder: NSCoder) { 
     super.init() 
     stuffs = aDecoder.decodeObject(forKey: "stuff") as? [Stuff] ?? [] 
    } 

    open func encode(with aCoder: NSCoder) { 
     aCoder.encode(stuffs, forKey: "stuffs") 
    } 
} 

MyClass出與的CocoaPods框架後,我開始得到這些崩潰:

CoreData: error: exception handling request: <NSSQLFetchRequestContext: 0x1c019d4d0> , *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (MyClass) for key (NS.objects); the class may be defined in source code or a library that is not linked with userInfo of { 
    "__NSCoderInternalErrorCode" = 4864; 
} 

任何想法,爲什麼?

+0

編輯:所以以後我從手機中刪除應用程序,並重新安裝,一切正常......但是,這如果我需要推出更新,是不會工作的... ... o在我從手機中刪除應用程序並再次安裝後,一切正常......但是如果我需要推送,這不會起作用出更新?... – 7ball

回答

2

通過將這個類移動到一個框架中,你已經改變了它的全名。在此之前,這將是MyApp.MyClass,但現在是MyFramework.MyClass。鍵控存檔不知道它們是相同的,這是造成您的問題的原因。刪除並重新安裝讓您解決了問題,因爲不再有任何舊數據可以解碼。

您可以通過使用setClass(:forClassName:)來告訴非存檔進程如何解決衝突,以便控制類/名稱匹配。你會做類似

NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyApp.MyClass") 

這將修復解碼。爲了保持往返編碼/解碼的工作,你可能需要做歸檔同樣的事情,像

NSKeyedArchiver.setClassName("MyApp.MyClass", for: MyClass.self) 
+0

這正是發生了什麼事。非常感謝您的幫助! – 7ball

+0

快速跟進問題:我正在嘗試編寫一些遷移邏輯,因爲將會安裝舊數據和新數據(沒有先前的「髒」)數據。你有快速的方法來檢查這些情況嗎? – 7ball

+0

如果您在上面添加了正確的命名調用,您將能夠解碼現有數據。沒有理由停止使用那個名字。如果你願意,你可以省去'NSArchiver'調用,新的檔案將使用框架名稱。 –