簡體   English   中英

CoreData並發和釋放對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM