【发布时间】:2011-12-22 19:02:23
【问题描述】:
我在主线程上有一个NSFetchedResultsController。同样从主线程,我异步发送一个 JSON 网络请求。当该 JSON 字符串返回时,我启动一个 NSOperation,它初始化一个新的(背景)NSManagedObjectContext,解析 JSON 字符串,创建/更新 NSManagedObject,并将它们保存在上下文中。后台上下文与主上下文具有相同的 persistentStore。有了这个,我有两个问题:
我认为从任何上下文(在任何线程上)保存到持久存储区都会通知主
NSFetchedResultsController有更改,但到目前为止它没有收到任何更改。我应该做些什么来通知主线程的NSFetchedResultsController有外部save以便tableView相应地更新?所以,在主线程上,我订阅了
NSManagedObjectContextWillSaveNotification,并正确地看到所有上下文(包括完全存在于单独线程上的上下文)何时执行save操作。 apple docs 说notification.userInfo应该有一个包含 3 个数组的字典,一个数组用于后台线程上的每个“更新、删除和插入”模型对象。但是,userInfo对我来说始终是nil。任何想法我做错了什么?
订阅 AppDelegate 中的NSManagedObjectContextWillSaveNotification:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(managedObjectContextDidSave:)
name:NSManagedObjectContextWillSaveNotification
object:nil];
以及AppDelegate中保存上下文的方法:
- (void)managedObjectContextDidSave:(NSNotification *)notification {
DLog(@"notification: %@", notification); //not nil
DLog(@"notification user info: %@", notification.userInfo); // always nil... why??
NSManagedObjectContext *theContext = notification.object;
if(theContext != context) {
DLog(@"---- SAVED ON ANOTHER CONTEXT");
// should I notify NSFetchedResultsController that there were context saves on background threads?
// how can I merge contexts if userInfo is nil?
}
}
我还想知道处理多线程(使用单独的 NSManagedObjectContexts)和核心数据的最佳实践。
【问题讨论】:
标签: multithreading core-data nsfetchedresultscontroller nsmanagedobjectcontext nsoperationqueue