2012-03-19 155 views
1

所以我知道NSManagedObjects不是線程安全managedObjectIDs是,我們需要每個線程單獨managedObjectContext。但最近我有一個問題,當我在做後臺的一些核心數據的變化(有這一個單獨的runloop線程)和performSelectorOnThread:方法有時簡單地不調用這個runloop線程。原來的原因是我在做會發生什麼?

[someObject.managedObjectContext save:&error] 
這個runloop線和「someObject」

主線程上創建。但它只會偶爾「掛起」迴旋線程。所以問題是如果你嘗試在不同的線程中保存上下文會發生什麼。我只是在尋求更深入的瞭解,謝謝。

+2

嘗試想像所有生命,因爲你知道它瞬間停止,並且你體內的每個分子都以光速爆炸。 – rickster 2012-03-19 16:45:20

回答

1

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html

核心數據使用線程(或序列化隊列)約束,以保護 管理對象和管理對象上下文(請參閱「使用 核心數據併發性」)。這樣做的結果是上下文假定默認所有者是分配它的線程或隊列 - 這是由調用其init方法的線程決定的 。你不應該,因此 ,初始化一個線程上下文然後將它傳遞到 不同的線程。相反,您應該傳遞對持久存儲協調器的引用,並讓接收線程/隊列創建一個新的從上面導出的上下文 。

0

你會崩潰。也許它有時會起作用,在調試時你不會看到崩潰,但你永遠不應該這樣做。對象上下文和它們中的託管對象只能用於創建它們的線程。蘋果公司的文檔對此非常清楚,並給出瞭如何處理的情況下,你可能有長時間運行的操作的例子很多(慢取或異步保存)。您應該閱讀有關使用Core Data進行線程化的文檔以獲取更多信息。