Я, имеют проблему, где я обновляю 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;
}
Любая справка ценится
Если вы сохраняете фоновый контекст в фоновом потоке, а затем слушаете NSManagedObjectContextObjectsDidChangeNotification
в основном потоке, вы можете вызвать -mergeChangesFromContextDidSaveNotification:
в основном контексте (в основном потоке) и изменения появятся, как только вы выполните сохранение в фоновом потоке.