NSManagedObject:在单独的线程上创建

Bry*_*yan 5 cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext

我知道Core Data不是线程安全的,并且与上下文关联的NSManagedObjectContext和NSManagedObjects不能从线程传递给线程.

题:

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

语境:

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

如果我无法在后台线程上创建managedObject,那么我需要创建一个字典,将字典传递给主线程,读取键,从这些值创建managedObject等等.如果可能的话,在后台线程上使用managedObject.

dev*_*oug 7

更好的方法是每个线程都有一个上下文.这样每个线程都有自己的便笺本可以玩.然后,当后台线程完成时,告诉主线程更新其视图或ui表视图或每个人如何呈现数据.

发生更改时,您需要通知主线程.最大的问题是,不同线程和主线程之间的上下文彼此不了解.核心数据中有一种方法可以使上下文保持同步.如果要保存,后台线程上的上下文应该广播NSManagedObjectContextDidSaveNotification通知.

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

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

mergeChanges将是您的NSOperation实例中的私有方法.

合并更改的示例

- (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];  
}
Run Code Online (Sandbox Code Playgroud)