2015-05-21 67 views
1

我想在Swift中製作一個天氣應用程序,它將保存我添加到核心數據中的城市,每個城市都包含一個天氣對象,該對象也保存到核心數據和其他各種變量中。我很快就發現,在覈心數據上下文之外使用核心數據NSManagedObjects子類幾乎是不可能的(處理NSNumber和類似的問題,沒有自定義的初始化,被迫將它們保存在某處,如果我明天停止使用核心數據, ...)。如何在Core Data上下文之外使用Core Data模型子類?

那麼,繼續使用核心數據的最佳做法是什麼,但是還要在上下文之外使用模型?

我的解決方案,現在是創建一個類爲每個型號,所以:

class City 
{ 
    var country: String? 
    var name: String? 
    // ... 
} 

是對應的類:

class CD_City 
{ 
    @NSManaged var country: String? 
    @NSManaged var name: String? 
    // ... 
} 

所以我可以用City任何地方,反正我想要的。但我需要一個func將City變成CD_City和相反。所以我真的不確定我是否是最好的方法。 另外你會推薦什麼樣的轉換方法?

(FYI我使用MagicalRecord作爲核心數據助手)

回答

4

TL; DR - 不要做的事或將打破。

曾經有過各種各樣的黑客來獲取它的工作,但他們都依賴於CoreData中的無證行爲。我會從來沒有在代碼中使用類似的東西我想展示另一個人,更少的客戶。 CoreData需要在你的模型對象中插入proxy objects,並將其掛鉤到property change events,並且它唯一能夠可靠地做到這一點並跟蹤原始數據值的方法是,如果它負責首先創建這些實體;這也使faulting & uniquing system工作。不要將核心數據視爲ORM,它確實是一個object graph management framework,因此它被設計成以某種方式使用,沒有簡單的解決方案來安全地安全

+0

所以也不推薦我的解決方案?例如,你如何在ViewController中使用你的模型?我的意思是,在我的情況下,我想根據用戶的位置創建一個城市,但我不想將它保存到Core Data,根據你我是不行的? – allbto

+0

CD從頭開始設計以管理自己的物體及其創作。請不要使用核心數據,或者將您的對象作爲協議傳遞到控制器中。您的CD實體可以實現該協議,因爲可以使不在CD中的「啞」對象,並且您的控制器將不知道其差異。我鼓勵你重新審視哪些需求導致你使用CoreData - 可能有另一種持久性機制可以滿足你的需求,並且沒有CD的包袱。 – RyanR

+0

我花了很長時間才找到這個鏈接:[YAPDatabase](https:// github。com/yapstudios/YapDatabase)非常好。 – RyanR

1

如果你不想保存NSManagedObject或它的一個子類,那麼你就可以

init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 

創建並傳遞nilinsertIntoManagedObjectContext這將創建你的實例,但它會不會是保存到了商務部。

如果你要稍後保存到MOC,您可以使用NSMangedObjectContext的

func insertObject(_ object: NSManagedObject) 
+0

我會嘗試一下,謝謝! – allbto

相關問題