2012-06-27 34 views
0

有主題關於螺紋約束模式Core Data programming Guide和它說,爲什麼要爲串行隊列和併發隊列啓動創建上下文?

您必須創建的將使用在其上線的管理範圍內。如果您使用NSOperation,請注意其init方法在與調用方相同的線程上調用。因此,您不得爲隊列的init方法中的隊列創建託管對象上下文,否則它將與調用方的線程關聯。 相反,您應該在main(對於串行隊列)或start(對於併發隊列)中創建上下文。

我只是不能得到爲什麼是嗎?區別在哪裏?

回答

2

這說明了爲什麼你在引用的文檔中很清楚。操作init方法在調用者線程上運行,而在main方法中發生的工作可能在另一個線程上運行

由於您不能在線程之間共享託管對象上下文,因此您需要在使用它的同一線程上創建它。因此,如果您在操作中使用它,則需要確保在操作運行時在同一線程上創建上下文。

串行操作在main中創建上下文的原因是,它們運行默認的start實現,而在實現併發操作時覆蓋start

你可以閱讀更多有關操作的Concurrency Programming Guide如何同時工作(提示:搜索「開始」)

+0

哦,我完全忘了,沒有必要重新實現'非併發操作start'方法。非常感謝。 – folex

0

大衛是正確的。

的文檔是說如果,例如,你有一個NSOperation子類,稱爲MyOperation並且覆蓋了init方法像下面

- (id)init 
{ 
    if(self = [super init]) { 

     // your context here  
    } 

    return self; 
} 

然後,如果你實例像

主線程操作
MyOperation* op = // alloc-init 

您所創建的上下文與主線程的操作運行,其中聯和與線程成。

當您在託管對象上執行更改(刪除,更新等)時會發生奇怪的事情,因爲您在後臺更改它們,但您訪問主線程中的上下文。

覆蓋main而不是創造有上下文:

- (void)main 
{ 
    // your context here 
} 
+0

P.S.我認爲,在iOS 5中,這些規則已經實施,如果你這樣做,你會崩潰。 –