2012-07-14 58 views
7

我想用一個NSOperationQueue派遣CoreData操作。但是,操作隊列行爲並不總是相同的(例如,在使用線程池的iOS 4.0/OS 10.6上使用libdispatch進行調度),並且隊列可能不總是使用相同的線程(如NSManagedObjectContext要求)。NSOperationQueue指定線程

我可以強制串行NSOperationQueue在單個線程中執行? 或者我必須爲此創建自己的簡單排隊機制?

+0

您可能不需要知道您的操作正在哪個線程上執行。您可以鎖定上下文(使用' - [上下文鎖定]')並在完成後解鎖。注意不要從鎖定的塊中訪問任何Core Data屬性。不要忘記將最大併發操作設置爲1以避免需要上下文同步。 – cdelacroix 2012-07-14 23:24:57

回答

3

我可以強制串行NSOperationQueue在單個線程中執行? 或者我必須爲此創建自己的簡單排隊機制?

你不應該需要做這類原因。 Core Data真正需要的是,您沒有兩條代碼同時對受管對象上下文進行更改。目前在Concurrency with Core Data一開始甚至一張紙條上這樣的:

注:您可以使用線程,串口操作隊列或調度隊列併發。 爲了簡潔起見,本文全文使用「線程」來指代其中的任何一個。

真正需要的是您在給定的上下文中序列化操作。如果您使用單個線程,則會自然發生,但如果將maxConcurrentOperationCount設置爲1,則NSOperationQueue也會序列化其操作,因此您不必擔心所有操作都發生在同一個線程上。

+4

警告:這個答案是'錯誤的'! Coredata需要每個THREAD一個上下文(真正的!) – 2012-11-02 08:48:11

+0

我以爲你需要每個線程的MOC,不是嗎? – ruipacheco 2012-11-02 10:14:26

+0

@Dominick,請爲你的斷言提供權威參考。我的答案中的信息直接來自Apples文檔,並且WWDC多次重複了同樣的想法。 – Caleb 2012-11-02 12:19:11

-1

蘋果公司決定結合的管理對象,以真實線程..它不是說安全了訪問在不同的線程上下文 - 上下文,沒有任何物體可能是安全的,但其對象不是

+0

請再次提供參考。您的建議與Core Data文檔相矛盾,在iOS 6 SDK發行說明中我沒有看到任何支持您答案的內容。那麼你在哪裏獲得你的信息? – Caleb 2012-11-02 13:45:57

+0

請參閱上述答案中的文檔;)並查看google ..例如:http://stackoverflow.com/questions/67154/is-it-safe-to-manipulate-objects-that-i-created-outside-my-線程,如果我不dont-exp – 2012-11-07 13:30:47

+0

感嘆..爲什麼投票 - 請至少花幾秒鐘來解釋它 – 2015-06-30 17:45:46