[英]CoreData concurrency and releasing objects
我目前正在驗證新的CoreData體系結構,該體系結構已在多線程環境中使用。 為了進行分析,我使用GDCoreDataConcurrencyDebugging打印警告,每次從錯誤的線程/隊列訪問ManagedObject時(據我所知)。
現在我收到大量這樣的警告:
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並發性和對象釋放方面有什么特別的錯過嗎? 我環顧四周,沒有提到任何有關對象釋放的內容,僅涉及到我沒有使用的自動釋放池。
您正在performBlockAndWait:
調用中執行工作,這是正確的。 但是,您可能繼續從其他線程返回對象。 那是不合法的。 必須從創建對象的線程/隊列訪問所有托管對象,但objectID
屬性始終有效。
請使用此代碼獲取managedObjectContext。必須從創建對象的線程/隊列訪問托管對象。
- (NSManagedObjectContext *)managedObjectContext
{
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
//
if ([self persistentStoreCoordinator] != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
}
[_managedObjectContext setRetainsRegisteredObjects:YES];
[_managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
return _managedObjectContext;
}
else
{
//Return separate MOC for each new thread
NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
[threadManagedObjectContext setPersistentStoreCoordinator: coordinator];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];
}
return threadManagedObjectContext;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.