標題問題的簡單示例:一個線程已準備好Place實體並正在對其進行一些處理(填充特定字段並且其計算需要時間),同時另一個線程已經準備了Category實體;第二個「類別」線程想要堅持類別實體與保存:&錯誤導致從第一個線程的地方實體也被保存,也沒有完成其處理工作。當每個線程可以使用與其他線程中的數據無關的數據時,是否可以重用一個共享託管對象上下文的線程?
我對不對?如果我使用一個共享moc,我會看到描述的問題嗎?
謝謝!
標題問題的簡單示例:一個線程已準備好Place實體並正在對其進行一些處理(填充特定字段並且其計算需要時間),同時另一個線程已經準備了Category實體;第二個「類別」線程想要堅持類別實體與保存:&錯誤導致從第一個線程的地方實體也被保存,也沒有完成其處理工作。當每個線程可以使用與其他線程中的數據無關的數據時,是否可以重用一個共享託管對象上下文的線程?
我對不對?如果我使用一個共享moc,我會看到描述的問題嗎?
謝謝!
不要在線程間共享NSManagedObjectContext
。不要在線程中共享NSManagedObject
。真的沒有例外。閱讀Concurrency with Core Data並應用它描述的模式。
其實,這是可能的,而且你正在尋找的方法是:
-(void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification;
你必須爲每個線程創建一個不同的NSManagedObjectContext
和所有你需要做的就是把你NSManagedObjectContext
在NSNotification
中的NSManagedObjectContextDidSaveNotification
密鑰,並將其註冊到默認中心。在它的調用中,在主線程上執行mergeChangesFromContextDidSaveNotification
,每當您調用save:&error
方法時,您的更改將被合併。
注意:它有一個小缺點,在我看來,雖然取一個對象,它可以屬於不同的上下文(這將是零取後),如果確實如此,你必須以不同的方式取,
NSManagedObjectID *objectID = [YourObject objectID];
YourObject *copy =(YourObject*) [managedObjectContext objectWithID:objectID];
希望它能幫助。 Here是更好地理解我所說的內容的鏈接。