主线程上的NSFetchedResultsController忽略从另一个线程保存到Core Data?

时间:2011-12-22 19:02:24

标签: multithreading core-data nsfetchedresultscontroller nsmanagedobjectcontext nsoperationqueue

主线程上有NSFetchedResultsController。同样从主线程,我异步发送JSON的网络请求。当该JSON字符串返回时,我启动一个NSOperation,其中包含一个新的(背景)NSManagedObjectContext,解析JSON字符串,创建/更新NSManagedObject,并将它们保存在上下文中。后台上下文与主上下文具有相同的persistentStore。有了这个,我有两个问题:

  1. 我认为从任何上下文(在任何线程上)对持久性存储的任何保存都会通知主NSFetchedResultsController存在更改,但到目前为止它没有获取任何更改。我应该做些什么来通知主线程的NSFetchedResultsController有外部save,以便tableView相应更新?

  2. 因此,在主线程上,我订阅NSManagedObjectContextWillSaveNotification并正确地查看所有上下文(包括那些完全存在于单独线程中的上下文)执行save操作的时间。 apple docs表示notification.userInfo应该有一个3个数组的字典,一个数组用于后台线程上的每个“更新,删除和插入”模型对象。但是,userInfo对我来说总是nil。我有什么想法吗?

  3. 订阅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)和核心数据的最佳实践。

1 个答案:

答案 0 :(得分:5)

您发现错误的通知:您需要注意的通知名称为NSManagedObjectContextDidSaveNotification(不是NSManagedObjectContextWillSaveNotification)。