Core data 核心数据和并发,2个解决方案,我应该使用哪种方式?

Core data 核心数据和并发,2个解决方案,我应该使用哪种方式?,core-data,concurrency,Core Data,Concurrency,我从服务器上获取一些数据,需要对其进行解析。然后,可能需要使用核心数据保存一些解析结果 这是我现在的代码: - (void)receiveSomeMessage:(NSString *)message { [self performSelectorInBackground:@selector(parseMessage:) withObject:message]; } - (void) parseMessage:(NSString *)message { NSAutoreleas

我从服务器上获取一些数据,需要对其进行解析。然后,可能需要使用核心数据保存一些解析结果

这是我现在的代码:

- (void)receiveSomeMessage:(NSString *)message
{
    [self performSelectorInBackground:@selector(parseMessage:) withObject:message];
}

- (void) parseMessage:(NSString *)message
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    NSManagedObjectContext *BGMOC =  [[NSManagedObjectContext alloc] init];
    [BGMOC setPersistentStoreCoordinator:[self.appDelegate persistentStoreCoordinator]];

    //parse it
    //write to core data 

    NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
    [dnc addObserver:self selector:@selector(addContextDidSave:)    name:NSManagedObjectContextDidSaveNotification object:BGMOC];

    NSError *saveError;
        if (![BGMOC save:&saveError]) {
            //handle the error
        }
    [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:BGMOC];
}

- (void)addContextDidSave:(NSNotification*)saveNotification {

// Merging changes causes the fetched results controller to update its results
[self.appDelegate.managedObjectContext   mergeChangesFromContextDidSaveNotification:saveNotification];
}
这似乎奏效了

但苹果的文件说:在后台线程中保存是容易出错的

所以我想知道这是一项工作:

-(void) parseMessage:(NSString *)message 

{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
   //parse it and save it to a dictionary
    [self performSelectorOnMainThread:@selector(saveToCoreData:) withObject:dictionary waitUntilDone:YES];
 [pool release];
}
解析完消息后,我将其打包成一个字典,并将其传递给主线程,然后在那里处理核心数据。这行吗?如果有效,是否更好

谢谢。

不要说在后台保存在技术上容易出错,他们暗示程序员在后台保存时容易出错:

异步队列和线程不支持 阻止应用程序退出。 (特别是,所有基于NSThread的 线程已“分离”-请参阅 完整的pthread文档 详细信息和流程仅在 所有未分离的线程都已退出。) 如果在中执行保存操作 背景线程,因此,它可能 还没来得及杀了它 完成如果你需要节省一个 后台线程,你必须写 附加代码,以便 线程阻止应用程序 在所有保存操作完成之前退出 完成了


翻译:“退出时,程序员必须特别注意后台操作的保存状态,而大多数情况下,他们不会。”我理解这一点。如果在主线程中执行此操作,则不需要创建新的NSManagedObjectContext,也不需要将其合并到主线程的上下文中,这似乎更简单。执行后台操作的主要原因是UI在前/主线程上运行,因此任何与主线程相关的操作都会冻结UI。由于服务器操作的滞后性,将服务器相关功能放在后台线程中几乎总是一个好主意。但是,您不必将数据保存在那里。您可以将其传递给主线程,并将其插入到上下文中。