objective-c - NSManagedObject:在单独的线程上创建

标签 objective-c cocoa core-data nsmanagedobject nsmanagedobjectcontext

我知道 Core Data 不是线程安全的,并且与上下文关联的 NSManagedObjectContext 和 NSManagedObjects 不能在线程之间传递。

问题:

但是,如果我的主线程上有一个 NSManagedObjectContext,我能否在后台线程上创建一个 NSManagedObject 对象(不将它附加到任何上下文——也就是说,只需在 NSManagedObject 上调用 alloc/init),然后传递那个 NSManagedObject回到主线程并从那里将其添加到上下文中?我查看了有关 Core Data 并发性的文档,但找不到任何说明这种使用模式没问题的内容。

上下文:

我有一个执行复杂任务然后发布结果的后台线程。结果是一个包含几个属性的 NSManagedObject 子类:时间、文件路径和成功或错误消息(作为字符串)。我想在后台线程上创建结果对象,然后将它扔回主线程并将其添加到核心数据上下文中,它将显示在 tableView 中。

如果我不能在后台线程上创建 managedObject,那么我需要创建一个字典,将字典传递给主线程,读取键,从这些值创建 managedObject,等等。看起来更干净如果可能,在后台线程上创建 managedObject。

最佳答案

更好的方法是让每个线程都有一个上下文。这样每个线程都会有自己的暂存器来玩。然后,当您的后台线程完成时,告诉您的主线程更新其 View 或 ui TableView 或您如何呈现数据。

当发生变化时,您需要通知您的主线程。最大的问题是,不同线程和主线程之间的上下文相互不了解。核心数据中有一种方法可以使上下文保持同步。当你想保存时,后台线程上的上下文应该广播一个 NSManagedObjectContextDidSaveNotification 通知。

例如,在 NSOperation 的 main 方法中,您可以这样做:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self
       selector:@selector(mergeChanges:)
           name:NSManagedObjectContextDidSaveNotification
         object:context];

mergeChanges 将是 NSOperation 实例中的私有(private)方法。

合并变化的例子

- (void)mergeChanges:(NSNotification *)notification
{
    ApplicationController *appController = [[NSApplication sharedApplication] delegate];
    NSManagedObjectContext *mainContext = [appController managedObjectContext];

    // Merge changes into the main context on the main thread
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                  withObject:notification
                               waitUntilDone:YES];  
}

关于objective-c - NSManagedObject:在单独的线程上创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614405/

相关文章:

Objective-C 未初始化指针与空指针

swift - NStableView 不显示我的数据

ios - 使用计算值连接核心数据对象

ios - NSPredicate 包含搜索包含数字和字母的字符串

macos - 访问cocoa中父类的对象

swift - 如何在后台线程中使用新的过滤谓词重新加载 NSFetchedResultsController ?

ios - NSURLConnection 的 didReceiveData 在 dispatch_async block 中不起作用

ios - 返回对象不为空但为空

ios - @synchronized block 与 GCD dispatch_async()

cocoa - 在 cocoa 应用程序中选择 iPhoto 图像