主线程上有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)和核心数据的最佳实践。
答案 0 :(得分:5)
您发现错误的通知:您需要注意的通知名称为NSManagedObjectContextDidSaveNotification
(不是NSManagedObjectContextWillSaveNotification
)。