2012-11-26 27 views
4

我正在嘗試重新創建本可可文章文章(http://www.cocoanetics.com/2012/07/multi-context-coredata/)中描述的三層核心數據系統。我遇到的問題是在自己的後臺線程上創建私有MOC。我沒有太多的多線程經驗,應該如何在目標c中完成。我一直在閱讀文章,並試圖掌握如何正確實施這種方法,但我終於承認,我不知道我在做什麼。創建核心數據寫入的背景線程

要創建這種方法,我需要創建一個NSThread並進行管理嗎?還是有一種我不理解的簡單方法?

回答

5

在後臺執行核心數據操作的最簡單方法是創建NSPrivateQueueConcurrencyType的受管對象上下文。這種類型的MOC創建和管理專用隊列。使用performBlockperformBlockAndWait在專用MOC上執行操作可確保使用正確的隊列。

Concurrency Support for Managed Object Contexts參見在 爲OS X v10.7的核心數據版本註釋和iOS 5.0對於細節和例子。

我只能推薦觀看WWDC 2011會議303「iOS核心數據的新增功能」中的視頻或幻燈片,其中解釋了核心數據併發性。

+0

我仍然想知道的是關於所有這些如何與後臺線程交互?是否使managedObjectContext'NSPrivateQueueConcurrencyType'自動爲其提供一個不在主線程上運行的隊列?我不理解這個設置中的某些東西,它允許主線程在處理核心數據對象時保持空閒狀態。 – TheJer

+0

@TheJer:是的,私人類型的MOC創建它自己的隊列在後臺線程上運行。 –

+0

感謝您解決這個問題。我讀過的所有內容都只是錯過了這個文檔嗎? – TheJer

-3

管理線程是iOS中

非常基本的

要對後臺運行的東西,你這樣做:

- (void)someMethod { 
    // method is called on main thread normally 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     .... // here things are run in background 
    }); 
} 

要返回主線程的任何地方,這樣做:

- (void)someOtherMethod { 
    // method is called on background thread 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     ... // here things are on main thread again 
    }); 
} 
+0

我的印象是,當你使用dispatch_async時,你不能保證你會找到相同的線程?該塊只是分派給一個能夠在將來某個時間處理它的線程,對嗎?使用這種方法,我不明白如何在每次需要將新數據寫入PSC時堅持使用後臺MOC。 – TheJer

+4

這不是使用CoreData進行多線程處理的好方法。 – sosborn

+2

「NSManagedObjectContext」通常不是線程安全的。所以,請不要這樣做。 – memmons