我目前正在驗證我們在多線程環境中使用的新CoreData架構。爲了分析,我使用GDCoreDataConcurrencyDebugging打印警告,每次從錯誤的線程/隊列訪問ManagedObject時(據我瞭解)。CoreData併發和釋放對象
現在我得到噸警告的是這樣的:
Invalid concurrent access to managed object calling 'release'
我能夠把在產生警告休息點和代碼如下所示:
-(MyObject*) createMyObject {
return (MyObject*)[self insertNewObjectEntityWithName:@"MyObject"];
}
-(NSManagedObject*) insertNewObjectEntityWithName:(NSString*) entityName {
__block NSManagedObject *managedObject;
[self.managedObjectContext performBlockAndWait:^(void) {
managedObject = [NSEntityDescription insertNewObjectForEntityForName:entityName
inManagedObjectContext:self.managedObjectContext];
}];
return managedObject;
}
它打破了createMyObject
- 返回後的方法,我猜是當對象被釋放的時候。 CoreData-concurrency和object-release有沒有什麼特別的東西? 我環顧四周,沒有任何關於對象釋放的提及,只關於我不使用的autoreleasepools。
感謝您的快速響應。所以基本上我不允許從我的執行塊中提取任何對象? – TMob
正確。通常的做法是使用在同一個上下文中調用的完成塊,或者將'objectID's和refetch傳遞到不同的上下文中。 – Avi
哦,很無趣。我想我們必須改造我們的很多軟件架構。非常感謝 – TMob