2012-06-24 31 views
27

僅在MOC的子MOC已使用NSPrivateQueueConcurrencyType初始化的情況下使用NSMainQueueConcurrencyType初始化NSManagedObjectContext何時使用Core Data的NSMainQueueConcurrencyType?

爲了給出一些背景:我的應用程序有一個傳統的結構,主表視圖由NSFetchedResultsController驅動,數據使用具有自己的MOC的NSOperation子類從Web服務異步導入。我不確定這種情況下的兩個MOC是否應該使用NSConfinementConcurrencyType(我相信是默認設置),或者與主線程上的提取結果控制器相關聯的MOC是否應該使用NSMainQueueConcurrencyType並且後臺MOC應該使用NSConfinementConcurrencyType

回答

51

首先在覈心數據新上下文類型的食譜。

NSMainQueueConcurrencyType創建與主調度隊列和主線程相關聯的上下文。您可以使用這樣的上下文將其鏈接到在主線程上運行所需的對象,例如UI元素。

NSPrivateQueueConcurrencyType創建並管理一個私人調度隊列進行操作。您必須使用新方法performBlock:performBlockAndWait:。上下文然後將在其自己的專用隊列上執行傳遞的塊。

最後,NSConfinementConcurrencyType是默認類型,可以在創建它的線程中使用只有。所以,在你的NSOperation中,你已經以正確的方式使用它。一個簡單的說明。如果要將其用作子上下文,則需要有一個「隊列上下文」(NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType)。

現在,關於你的問題。

正在初始化使用 NSMainQueueConcurrencyType只爲那MOC存在使用NSPrivateQueueConcurrencyType初始化的 孩子MOC局勢的NSManagedObjectContext?

不,沒有必要。是的,你可以設置一個私人背景,在後臺執行一些工作,然後將檢索到的對象推到主背景上,但我會做相反的事情:使用NSPrivateQueueConcurrencyType作爲主背景,NSMainQueueConcurrencyType作爲前者的子背景。這樣,主要上下文將只處理內存中的對象。保存到磁盤只能由專用隊列執行。

該方法由UIManagedDocument類使用。保存到磁盤是在後臺線程(私有隊列)中執行的。用這種方式,UI不會凍結。

+1

@Ricardo對不起的delay..I的沒有想法......但你能看到的代碼。乾杯。 –

+0

NSPrivateQueueConcurrencyType並不總是對私人執行隊列塊。隨着performBlockAndWait它實際上鎖定的隊列,並執行調用線程,這可能是在主線程上。 – malhal

3

NSMainQueueConcurrencyType主要用於鏈接到UI的上下文。

爲了保持UI的響應,大部分業務邏輯最好在後臺線程和「後臺」上下文中完成。但是UI本身需要在某個時候使用上下文,例如NSMainQueueConcurrencyType

帶有NSMainQueueConcurrencyType的子上下文非常適合於編輯可以一次保存更改的窗格,即提交給父上下文。家長不需要使用NSMainQueueConcurrencyType

NSConfinementConcurrencyType是默認的類型。它將上下文鏈接到當前線程,順便說一句,通常是主線程。您不應該依賴默認類型,而應該使用最簡單的應用程序。 NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType是最好的,因爲你正好知道哪個隊列在使用每一個方面。

相關問題