澄清

2014-01-13 293 views
2

一邊唸叨NSConfinementConcurrencyType的醫生,我閱讀下列澄清

不能使用結合這種併發類型與新 嵌套環境功能

這個句子對我來說很奇怪,因爲我可以做,例如,在NSOperation的子類中,如

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

其中mainContext可以從外部注入並且類型爲NSMainQueueConcurrencyType

我錯過了什麼嗎?

回答

2

是的,該文檔是很差措辭。

我覺得它的意思是,你不能使用:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
[moc setParentContext:[self managedObjectContext]]; 

這一點我以前測試,它沒有失敗,出現錯誤。 YMMV,當然,我在iOS 5.x中測試它。

這比不同:

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

這工作得很好,是核心數據設計的一部分。

兩個初始化程序之間存在細微差別,而較早的歷史初始化程序缺少一些允許父子上下文正常工作的關鍵組件。

+1

嗯,我很確定我不得不幾次改變爲私有隊列類型,因爲我想添加一個子上下文。很確定我得到了奇怪的行爲或使用受限類型作爲父項的錯誤。出於某種原因,這些類型的錯誤並不是每次都會發生,但是當您進行一些更改並檢測到問題時,會在奇數時間出現。 –

+1

更重要的是,限制隊列期望上下文被創建它的線程訪問和改變。如果孩子MOC從另一個線程推送更改,則只是要求未定義的行爲。 – CodaFi

+0

不錯。謝謝你做一些測試。 –

1

我可能是錯的,但根據一個簡短的測試是在我看來,在NSConfinementConcurrencyType

限制 不能結合新 嵌套環境功能

使用這種併發類型

適用於父上下文而不適用於子上下文。所以

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

作品,只要[self mainContext]已與主或私人 隊列併發類型創建。

+0

如果這就是他們的意思,那麼它就比我想象的更糟糕了:)話雖如此,我已經把孩子們關在一個密閉的MOC之前,沒有任何不良影響,所以我不認爲閱讀是準確的。 –

+0

@ MarcusS.Zarra:將孩子附加到受限制的MOC(或默認MOC)時使用父類NSManagedObjectContext必須在我的測試中使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType.'',而與子MOC的類型無關。 –

+0

有趣。時間去找到這個例子或者檢查內存問題。感謝您的雙重檢查:) –