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。由于服务器操作的滞后性,将服务器相关功能放在后台线程中几乎总是一个好主意。但是,您不必将数据保存在那里。您可以将其传递给主线程,并将其插入到上下文中。