2013-02-02 101 views
4

我正在使用核心數據的應用程序,我知道這不是線程安全的,但正在努力瞭解如何正確管理這一點。讓我解釋我到目前爲止...核心數據和主題

我創建了一個單身啓動管理對象,然後可用於所有其他類,這似乎工作正常,因爲收到相同的管理對象地址所有課程。

然後我有以該順序執行的兩個clases ...

  1. 數據負載。這將獲得記錄計數,並且如果零加載核心數據庫。
  2. 泰伯維那則顯示數據存儲在步驟1中

我的問題是,第1步總是返回零個記錄,和第2步是工作,返回正確的記錄數。

已經完成了一些測試1.問題是由於它運行的線程,如果我在同一個線程上發送請求,以便在其上創建管理對象,它可以很好地工作。

那麼爲什麼它在第1課。我必須確保請求是在正確的線程,但在第2課。它只是工作,或者它只是純粹的運氣。對線程和核心數據有推薦和書面的方法嗎?

感謝

+3

http://www.cocoanetics.com/2012/07/multi-context-coredata/是一篇關於此主題的精彩文章。 – jrturton

回答

11

在覈心數據併發的金科玉律是:各的NSManagedObjectContext,只能從一個線程訪問 - 線程它是在創建。另外,一個被管理的對象只能用於你獲取的MOC - 不會傳遞給其他MOC!

但是,您可以在線程之間共享持久性存儲協調器,因爲每個MOC在使用PSC時鎖定PSC - 所以常見設置是爲多個MOC創建一個PSC。

此處瞭解詳情:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html

如果你的情況似乎2.使用不同的線程時要工作,我會說這是越往下運氣,它並不能使它正確要做的事。不要依靠運氣,遵循我上面提到的規則,一切都會很好。

其他相關閱讀:

What is meant by CoreData is not thread safe?

http://www.cocoanetics.com/2012/07/multi-context-coredata/

http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

http://digitalflapjack.com/blog/2010/jun/11/parallelcoredata/

http://www.duckrowing.com/2010/03/11/using-core-data-on-multiple-threads/

作爲一般規則,這是值得記住的是,當API或文檔說「不要做X」,它並不意味着做X將失敗或遇到問題,每一次 - 它只是手段那有一天它可能會回來困擾你。不要將事情放在一邊,找出你可以做什麼(API文檔等)並做到這一點。

+0

近3年後,儘管iOS開發發生了重大變化,但其中的大部分仍然相關。謝謝。 –