簡體   English   中英

擁有多個NSPersistentStoreCoordinators是否有意義?

[英]Does it make sense to have multiple NSPersistentStoreCoordinators?

我是Core Data的新手,我正在努力確保我的數據模型及其使用設置正確。

我在我的應用程序中基本上有兩種文件類型...一種包含設置類型數據,另一種包含用戶將使用的數據集(類似文檔,盡管我可以想象用戶在10s甚至100s中工作文件同時)。

我一直在閱讀關於Core Data的書籍,我記得讀過,通常一個應用程序有一個NSPersistentStoreCoordinator ,一個NSManagedObjectContext和一個NSManagedObjectModel

我目前有一個托管對象模型,其中包含我所擁有的各種文件類型的配置。 我一直在計划使用NSPersistentStoreCoordinators / NSManagedObjectContexts ,當我創建新的Core Data對象時,我會確保每個對象都添加到正確的持久存儲中。

但是,我已經看到了每個文件都有自己的NSPersistentStoreCoordinatorNSManagedObjectContext示例。

在單個線程應用程序中使用多個NSPersistentStoreCoordinatorsNSManagedObjectContexts是否有優點和缺點?

最初,我一直希望能夠在用戶剪切和粘貼類型編輯過程中將對象從一個持久存儲移動到另一個存儲,但這似乎不可能。

任何意見是極大的贊賞!

編輯

這里有一些關於讓我感到困惑的更多信息。 當我閱讀有關NSPersistentStoreCoordinator的文檔時,它說:

協調器旨在向托管對象上下文提供外觀,以便一組持久性存儲顯示為聚合存儲。

就我而言,這不是我想要的。 我希望我的文檔被視為單獨的文檔,我不希望查詢彼此混淆。

此外,只有一個持久性存儲協調器和許多持久性存儲,如果我忘記在創建時將實體分配給正確的存儲,我發現自己有錯誤,因為實體在創建時被任意分配給有效存儲。 我不確定指向不同商店中的對象的關系會發生什么(可能是斷言失敗?)。

對我來說,似乎每個商店擁有一個上下文/持久性存儲協調器不太容易出錯,並允許我保持每個文檔的數據彼此隔離。

單個持久性商店似乎唯一能給我買的是我可以同時對所有商店執行保存操作,這是更好的選擇。 對於多個上下文/存儲協調器,我需要執行單獨的保存操作。

如果您使用OSX NSPersistentDocument類,它似乎會為每個文檔強制執行單獨的上下文/存儲協調器。

無論如何,從我的所有研究來看,似乎單獨的商店協調員/上下文對我的應用程序更有效,但我發布這個的原因是因為我是Core Data的新手並且這種做法似乎違背了建議的流程而且我'我擔心我會錯過一些會讓我咬傷的陷阱。

更多的想法/信息

當我更多地考慮這個並閱讀其他人的更多反饋時(謝謝大家!!!),我目前的想法如下。

對於我自己來說,這兩種方法之間似乎並沒有那么大的區別,我現在相信我可以讓它在任何一種方式都運行良好。

使用單個商店協調員,我需要確保新創建的實體附加到正確的商店(並不是很重要)。 對於多個商店協調員,我需要確保將新創建的實體添加到正確的上下文中(我將擁有其中的許多實體)。 通過我的代碼結構化方式,對我來說,這兩種方法都應該相對容易。

我個人想一次搜索一家商店。 如果我有多個商店協調員,這是自動的。 如果我有一個商店協調員,我需要確保約束獲取請求。 (無論哪種方式,都不是什么大不了的事)。

商店協調員的文檔暗示其優勢在於使多個商店顯示為一個。 對於我的應用程序,我不需要或不需要,所以這對我來說並不是一個考慮因素(盡管如果我希望將來添加跨店搜索功能,最好將所有內容保存在一個商店協調員中)。

對我來說,上述原因都不是真正好的論據,如果它們是唯一的論點,我可能會嘗試以更傳統的方式做事並堅持使用單一的商店協調員。

然而,最后一個原因(以及我最初發布此問題的主要原因)是我計划利用iOS 5中的某些功能,這些功能似乎需要多個商店協調員。 我希望能夠將我的應用程序弱連接到向后兼容,所以看起來我的iOS 4代碼與iOS 5代碼非常相似會更好。

我越是想到這一點,在支持多個OS版本的情況下,我仍然可以用正確的抽象方式實現任何一種方式。

謝謝大家的反饋! 我正在慢慢掌握核心數據,這主要是一次很棒的體驗,雖然它也讓我感到頭疼!

通常,應用程序將僅使用一個PersistentStoreCoordinator,並在app delegate中初始化。

有關更多詳細信息和說明,請查看Core Data上的apples doc

我不能老實地想到你想要擁有第二個協調員的原因,除非你在同一個模型上執行一些非常嚴重的並發,多線程任務。 根據您的描述,您可能只需要為某些托管對象創建單獨的上下文,或者如果您需要它們完全獨立,則可能需要單獨的商店。

您幾乎不會直接與持久性存儲協調器進行交互,因為大多數操作都是在上下文級別完成的,然后在您通過存儲協調器准備好(再次通過上下文)時保持不變。

你顯然已經完成了自己的研究,所以我不打算告訴你檢查文檔XYZ(核心數據有很好的文檔記錄基本級別的東西,但任何稍微高級的東西,你是你自己的),但我的主要觀點是,有每個模型的單獨商店協調員可能會增加代碼的復雜性,而不是使管理更容易,這似乎是您在原始問題中的主要動機。

我沒有看到在您的應用中擁有多個NSPersistentStoreCoordinator實例的任何實際技術限制,只要它們都指向磁盤上的唯一位置即可。

但是,采用這種方法絕對不常見,並且會增加您的應用程序的復雜性,這可能是不必要的。 根據您對數據模型的描述,我沒有看到您需要多個NSPersistentStoreCoordinator的原因。

請務必閱讀CoreData編程指南,並知道您需要為每個線程創建一個唯一的NSManagedObjectContext,而不是按照您在問題中描述的NSPersistentStoreCoordinator創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM