2012-10-10 30 views
1

標題問題的簡單示例:一個線程已準備好Place實體並正在對其進行一些處理(填充特定字段並且其計算需要時間),同時另一個線程已經準備了Category實體;第二個「類別」線程想要堅持類別實體與保存:&錯誤導致從第一個線程的地方實體也被保存,也沒有完成其處理工作。當每個線程可以使用與其他線程中的數據無關的數據時,是否可以重用一個共享託管對象上下文的線程?

我對不對?如果我使用一個共享moc,我會看到描述的問題嗎?

謝謝!

回答

1

不要在線程間共享NSManagedObjectContext。不要在線程中共享NSManagedObject。真的沒有例外。閱讀Concurrency with Core Data並應用它描述的模式。

1

其實,這是可能的,而且你正在尋找的方法是:

-(void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification;

你必須爲每個線程創建一個不同的NSManagedObjectContext和所有你需要做的就是把你NSManagedObjectContextNSNotification中的NSManagedObjectContextDidSaveNotification密鑰,並將其註冊到默認中心。在它的調用中,在主線程上執行mergeChangesFromContextDidSaveNotification,每當您調用save:&error方法時,您的更改將被合併。

注意:它有一個小缺點,在我看來,雖然取一個對象,它可以屬於不同的上下文(這將是零取後),如果確實如此,你必須以不同的方式取,

NSManagedObjectID *objectID = [YourObject objectID];

YourObject *copy =(YourObject*) [managedObjectContext objectWithID:objectID];

希望它能幫助。 Here是更好地理解我所說的內容的鏈接。

相關問題