Core Data 托管对象上下文线程同步

Posted

技术标签:

【中文标题】Core Data 托管对象上下文线程同步【英文标题】:Core Data managed object context thread synchronisation 【发布时间】:2010-03-08 00:30:23 【问题描述】:

我有一个问题,我在后台线程中更新多对多关系,这在该线程中工作正常,但是当我将对象发送回主线程时,更改不会显示。如果我关闭应用程序并重新打开,数据会很好地保存,并且更改会显示在主线程上。同样使用 [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;

任何帮助表示赞赏

【问题讨论】:

编辑:我错过了您之前使用的 threadDictionary。 【参考方案1】:

如果您将后台上下文保存在后台线程上,然后在主线程上侦听NSManagedObjectContextObjectsDidChangeNotification,您可以在主上下文(在主线程上)调用-mergeChangesFromContextDidSaveNotification:,并且更改将在您立即显示在后台线程上执行保存。

【讨论】:

以上是关于Core Data 托管对象上下文线程同步的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 3 托管对象上下文

在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存

在后台线程中更新托管对象上下文

从后台线程使用 Core Data 托管上下文......你如何正确地做到这一点?

将 Core Data XML 存储同步到磁盘