Базовый контекст управляемого объекта Данных распараллеливает синхронизацию

Я, имеют проблему, где я обновляю many-many отношения в фоновом потоке, который хорошо работает в тех трех, но когда я передаю объект обратно основному потоку, изменения не показывают. Если я закрываю приложение и вновь открылся, данные сохраняются прекрасные и шоу изменений на основном потоке. Также с помощью [блокировка контекста] вместо другого контекста управляемого объекта хорошо работает.

Я попробовал NSManagedObjectContext:

- (BOOL)save:(NSError **)error;
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;    

на различных этапах в течение процесса, но это, кажется, не помогает.

Мой базовый код данных использует следующего метода get, чтобы гарантировать, что любые операции ориентированы на многопотоковое исполнение:

- (NSManagedObjectContext *) managedObjectContext 
{   

    NSThread * thisThread = [NSThread currentThread];
    if (thisThread == [NSThread mainThread]) 
    {
        //Main thread just return default context
        return managedObjectContext;
    }
    else 
    {
        //Thread safe trickery
        NSManagedObjectContext * threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:CONTEXT_KEY]; 
        if (threadManagedObjectContext == nil)
        {
            threadManagedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];
            [threadManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]];
            [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:CONTEXT_KEY];
        }

        return threadManagedObjectContext;
    }
}

и когда я передаю объект между потоками, я использую

-(NSManagedObject*)makeSafe:(NSManagedObject*)object
{
    if ([object managedObjectContext] != [self managedObjectContext])
    {               
        NSError * error = nil;
        object =  [[self managedObjectContext] existingObjectWithID:[object objectID] error:&error];

        if (error) 
        {
            NSLog(@"Error makeSafe: %@", error);
        }
    }

    return object;
}

Любая справка ценится

7
задан Ben Reeves 8 March 2010 в 00:30
поделиться

1 ответ

Если вы сохраняете фоновый контекст в фоновом потоке, а затем слушаете NSManagedObjectContextObjectsDidChangeNotification в основном потоке, вы можете вызвать -mergeChangesFromContextDidSaveNotification: в основном контексте (в основном потоке) и изменения появятся, как только вы выполните сохранение в фоновом потоке.

9
ответ дан 7 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: