3 回答

TA貢獻(xiàn)1878條經(jīng)驗 獲得超4個贊
CoreData是其自己的持久性框架,根據(jù)其詳盡的文檔,您必須使用其指定的初始化程序,并遵循相當(dāng)特定的路徑來創(chuàng)建和存儲對象。
您仍然可以像使用Codable
一樣以有限的方式使用它NSCoding
。
一種方法是使用這兩種協(xié)議之一解碼對象(或結(jié)構(gòu)),然后將其屬性轉(zhuǎn)移到NSManagedObject
您根據(jù)Core Data文檔創(chuàng)建的新實例中。
另一種方法(非常常見)是僅對要存儲在托管對象屬性中的非標(biāo)準(zhǔn)對象使用一種協(xié)議?!胺菢?biāo)準(zhǔn)”是指不符合模型中指定的Core Data的標(biāo)準(zhǔn)屬性類型的任何內(nèi)容。例如,NSColor
不能將它直接存儲為托管對象屬性,因為它不是CD支持的基本屬性類型之一。相反,您可以用于NSKeyedArchiver
將顏色序列化為一個NSData
實例,并將其作為Data屬性存儲在托管對象中。用逆轉(zhuǎn)此過程NSKeyedUnarchiver
。這很簡單,使用Core Data可以有更好的方法(請參見Transient Attributes),但這說明了我的觀點(diǎn)。
您也可以想象采用Encodable
(組成的兩個協(xié)議之一Codable
-您能猜出另一個的名稱嗎?)將托管對象實例直接轉(zhuǎn)換為JSON以進(jìn)行共享,但是您必須指定編碼鍵和自己的自定義encode
實現(xiàn),它不會由編譯器使用自定義編碼鍵自動合成。在這種情況下,你要指定唯一要列入鍵(屬性)。
希望這可以幫助。

TA貢獻(xiàn)1993條經(jīng)驗 獲得超6個贊
Swift 4.2:
按照casademora的解決方案,
guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError() }
應(yīng)該
guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { fatalError() }。
這樣可以防止Xcode錯誤地將其識別為數(shù)組切片問題。
編輯:使用隱式解包的可選選項,無需.context每次使用時都強(qiáng)制解開。
- 3 回答
- 0 關(guān)注
- 653 瀏覽
添加回答
舉報