有主題關於螺紋約束模式在Core Data programming Guide和它說,爲什麼要爲串行隊列和併發隊列啓動創建上下文?
您必須創建的將使用在其上線的管理範圍內。如果您使用NSOperation,請注意其init方法在與調用方相同的線程上調用。因此,您不得爲隊列的init方法中的隊列創建託管對象上下文,否則它將與調用方的線程關聯。 相反,您應該在main(對於串行隊列)或start(對於併發隊列)中創建上下文。
我只是不能得到爲什麼是嗎?區別在哪裏?
有主題關於螺紋約束模式在Core Data programming Guide和它說,爲什麼要爲串行隊列和併發隊列啓動創建上下文?
您必須創建的將使用在其上線的管理範圍內。如果您使用NSOperation,請注意其init方法在與調用方相同的線程上調用。因此,您不得爲隊列的init方法中的隊列創建託管對象上下文,否則它將與調用方的線程關聯。 相反,您應該在main(對於串行隊列)或start(對於併發隊列)中創建上下文。
我只是不能得到爲什麼是嗎?區別在哪裏?
這說明了爲什麼你在引用的文檔中很清楚。操作init
方法在調用者線程上運行,而在main
方法中發生的工作可能在另一個線程上運行。
由於您不能在線程之間共享託管對象上下文,因此您需要在使用它的同一線程上創建它。因此,如果您在操作中使用它,則需要確保在操作運行時在同一線程上創建上下文。
串行操作在main中創建上下文的原因是,它們運行默認的start
實現,而在實現併發操作時覆蓋start
。
你可以閱讀更多有關操作的Concurrency Programming Guide如何同時工作(提示:搜索「開始」)
大衛是正確的。
的文檔是說如果,例如,你有一個NSOperation
子類,稱爲MyOperation
並且覆蓋了init
方法像下面
- (id)init
{
if(self = [super init]) {
// your context here
}
return self;
}
然後,如果你實例像
主線程操作MyOperation* op = // alloc-init
您所創建的上下文與主線程的操作運行,其中聯和不與線程成。
當您在託管對象上執行更改(刪除,更新等)時會發生奇怪的事情,因爲您在後臺更改它們,但您訪問主線程中的上下文。
覆蓋main
而不是創造有上下文:
- (void)main
{
// your context here
}
P.S.我認爲,在iOS 5中,這些規則已經實施,如果你這樣做,你會崩潰。 –
哦,我完全忘了,沒有必要重新實現'非併發操作start'方法。非常感謝。 – folex