Мое приложение использует NSFetchedResultsController, связанный с хранилищем базовых данных, и до сих пор оно работало хорошо, но сейчас я пытаюсь сделать код обновления асинхронным, и у меня возникают проблемы. Я создал подкласс NSOperation для выполнения своих обновлений и успешно добавляю этот новый объект в NSOperationQueue. Код обновлений выполняется так, как я ожидал, и я проверил это с помощью журналов отладки и проверки хранилища SQLite после его запуска.
Проблема в том, что после завершения моей фоновой операции новые (или обновленные) элементы не отображаются в моем UITableView. Исходя из моего ограниченного понимания, я считаю, что мне нужно уведомить основной managedObjectContext о том, что произошли изменения, чтобы их можно было объединить. Мое уведомление запускается, но новые элементы в табличном представлении не появляются. Если я остановлю приложение и перезапущу его, объекты появятся в табличном представлении, что наводит меня на мысль, что они успешно вставляются в основное хранилище данных, но не объединяются в managedObjectContext, используемый в основном потоке.
Я включил образец методов init, main и уведомлений моей операции. Я упускаю что-то важное или, может быть, поступаю неправильно? Любая помощь будет принята с благодарностью.
- (id)initWithDelegate:(AppDelegate *)theDelegate
{
if (!(self = [super init])) return nil;
delegate = theDelegate;
return self;
}
- (void)main
{
[self setUpdateContext:[self managedObjectContext]];
NSManagedObjectContext *mainMOC = [self newContextToMainStore];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:updateContext];
[self setMainContext:mainMOC];
// Create/update objects with mainContext.
NSError *error = nil;
if (![[self mainContext] save:&error]) {
DLog(@"Error saving event to CoreData store");
}
DLog(@"Core Data context saved");
}
- (void)contextDidSave:(NSNotification*)notification
{
DLog(@"Notification fired.");
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[delegate managedObjectContext] performSelectorOnMainThread:selector
withObject:notification
waitUntilDone:YES];
}
Во время отладки я исследовал объект notification
, который отправляется в contextDidSave:
, и он, кажется, содержит все элементы, которые были добавлены (отрывок ниже). Это продолжает заставлять меня думать, что вставки / обновления происходят правильно, но каким-то образом объединение не запускается.
NSConcreteNotification 0x6b7b0b0 {name = NSManagingContextDidSaveChangesNotification; object = <NSManagedObjectContext: 0x5e8ab30>; userInfo = {
inserted = "{(\n <GCTeam: 0x6b77290> (entity: GCTeam; id: 0xdc5ea10 <x-coredata://F4091BAE-4B47-4F3A-A008-B6A35D7AB196/GCTeam/p1> ; data: {\n changed =