У меня есть NSFetchedResultsController
в главном потоке. Также из основного потока я асинхронно отправляю сетевой запрос на JSON. Когда эта строка JSON возвращается, я запускаю NSOperation
, который вставляет новый (фоновый) NSManagedObjectContext
, анализирует строку JSON, создает / обновляет NSManagedObject
и сохраняет их в контексте. Фоновый контекст имеет тот же persistentStore, что и основной контекст. С этим у меня есть 2 вопроса:
Я думал, что любое сохранение в постоянном хранилище из любого контекста (в любом потоке) сообщит основному NSFetchedResultsController
, что есть изменения, но пока он не принимает никаких изменений. Есть ли что-то, что я должен сделать, чтобы уведомить основной поток NSFetchedResultsController
о том, что были внешние save
, чтобы tableView
обновлялся соответственно?
Итак, в основном потоке я подписываюсь на 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) и Базовыми данными.