我有一个问题,即我在后台线程中更新多对多关系,这在该线程中工作正常,但是当我将对象发送回主线程时,更改不会显示。如果我关闭应用程序并重新打开数据保存正常,更改显示在主线程上。使用[context lock]而不是使用不同的托管对象上下文也可以正常工作。
我尝试过NSManagedObjectContext:
- (BOOL)save:(NSError **)error;
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;
在整个过程的不同阶段,但似乎没有帮助。
我的核心数据代码使用以下getter来确保任何操作都是线程安全的:
- (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;
}
任何帮助表示赞赏
答案 0 :(得分:9)
如果您在后台线程上保存后台上下文然后在主线程上侦听NSManagedObjectContextObjectsDidChangeNotification
,您可以在主上下文(主线程)上调用-mergeChangesFromContextDidSaveNotification:
,并且更改将显示只要在后台线程上执行保存即可。