2012-08-25 57 views
5

什麼更適合於需要將數據存儲在一個線程的Core-Data中並從另一個線程的Core-Data中讀取的情況?核心數據的NSOperation VS GCD

我在想GCD,但它是如何與每個線程的NSManagedObjectContext的創建工作?如何在隊列中創建這些對象?

當對各種線程進行更改時,數據存儲需要更新/同步,這對於GCD或NSOperation更好嗎?

我希望能夠在根據需要讀取和寫入數據存儲時將塊傳遞到2個隊列,而不會有損壞存儲或具有不同版本的存儲的問題。

回答

16

GCD和NSOperation之間的爭論基本上可以歸結爲使用的參數最高級別的抽象爲您提供了一個很好的解決方案。

NSOperationQueue構建於GCD之上,因此它必須是更高級別的抽象。

但是,GCD在一般情況下非常容易使用,我發現在許多情況下優選NSOperationQueue

現在,當您將CoreData引入混合中時,我會建議第三種選擇。如果您使用的是iOS 5,那麼您可以對MOC使用私有隊列併發性。我發現這是一個很好的抽象,並提供了一個易於使用的界面。

所以,我建議你簡單地創建一個MOC的NSPrivateQueueConcurrencyType爲每個你想要做核心數據的線程。根據您的應用特點,您可以選擇是共享一個persistentStoreCoordinator,還是單獨使用。你甚至可以使用嵌套上下文(對於插入端來說是一個警告)。

基本上,它遵循這種模式...

NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType]; 
moc.parentContext = contextIWantToBeParent; 
moc.persistentStoreCoordinator = pscIWant; 

[moc performBlock:^{ 
    // Your MOC stuff running on its own private queue 
}]; 

當然,你必須選擇一個方法(無論是養育到現有的MOC或附加到一個PSC)。

我一般比較喜歡performBlock的方法。

編輯

感謝。我讀NSManagedObject是線程安全的。我如何 在該專用隊列上創建新的NSManagedObjects? - 氦3

是的,的確如此。但是,當您使用併發類型創建MOC時,您同意遵循這樣的合同。

我,一個精明的程序員,莊嚴同意有關併發以下核心數據規則:

  1. 如果我使用NSConfinementConcurrencyType,我只會創建它的線程上運行時使用它。

  2. 如果我使用NSPrivateQueueConcurrencyType,我將只使用performBlockperformBlockAndWait內的MOC。

  3. 如果我使用NSMainQueueConcurrencyType,我將只使用performBlock,performBlockAndWait內的MOC,或者當我知道我在主線程上運行時。

如果遵循這些規則,那麼您將能夠在其他線程上使用MOC。

具體來說,當使用performBlock時,Core Data API將確保代碼被正確地同步。

+0

謝謝。我讀NSManagedObject是線程安全的。我將如何在該專用隊列上創建新的NSManagedObjects? – jarryd

+0

感謝您的編輯。因此,如果NSManageObjects被添加到商店或由MOC進行併發編輯,那麼不需要手動同步商店? – jarryd

+0

對不起,我沒有按照這個問題。 –