NSFetchedResultsController в основном потоке игнорирует сохранение в Core Data из другого потока? - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть NSFetchedResultsController в главном потоке. Также из основного потока я асинхронно отправляю сетевой запрос на JSON. Когда эта строка JSON возвращается, я запускаю NSOperation, который вставляет новый (фоновый) NSManagedObjectContext, анализирует строку JSON, создает / обновляет NSManagedObject и сохраняет их в контексте. Фоновый контекст имеет тот же persistentStore, что и основной контекст. С этим у меня есть 2 вопроса:

  1. Я думал, что любое сохранение в постоянном хранилище из любого контекста (в любом потоке) сообщит основному NSFetchedResultsController, что есть изменения, но пока он не принимает никаких изменений. Есть ли что-то, что я должен сделать, чтобы уведомить основной поток NSFetchedResultsController о том, что были внешние save, чтобы tableView обновлялся соответственно?

  2. Итак, в основном потоке я подписываюсь на NSManagedObjectContextWillSaveNotification и правильно вижу, когда все контексты (включая те, которые существуют полностью в отдельном потоке) выполняют операцию save. apple docs говорят, что notification.userInfo должен иметь словарь из 3 массивов, по одному массиву для каждого из "обновленных, удаленных и вставленных" объектов модели в фоновом потоке. Тем не менее, userInfo всегда nil для меня. Есть идеи, что я делаю не так?

Подписка на NSManagedObjectContextWillSaveNotification в AppDelegate:

[[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 Ответ

5 голосов
/ 22 декабря 2011

Вы видите неправильное уведомление: название уведомления, которое вам нужно наблюдать, - NSManagedObjectContextDidSaveNotification (не NSManagedObjectContextWillSaveNotification).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...