NSFetchedResultsController не вызывает didChangeObject

Я должен начать с того, что все это прекрасно работает, когда я развертываю отладочную сборку на своем устройстве прямо из xcode. Я вижу эту проблему только при создании подписанного IPA выпуска.

У меня есть следующий выбранный контроллер результатов:

self.fetchedResultsController = [MyEntity MR_fetchAllSortedBy:@"date"
                                                       ascending:NO
                                                   withPredicate:[NSPredicate predicateWithFormat:@"sync == YES"]
                                                         groupBy:nil
                                                        delegate:self
                                                       inContext:[NSManagedObjectContext MR_defaultContext]];

Затем реализуйте метод делегата:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id) anObject atIndexPath:(NSIndexPath *) indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *) newIndexPath {
    switch(type) {
        case NSFetchedResultsChangeInsert: {
            NSLog(@"something was inserted");
            break;
        }
        case NSFetchedResultsChangeDelete:
            break;
        case NSFetchedResultsChangeUpdate: {
            NSLog(@"something was updated");
            break;
        }
        case NSFetchedResultsChangeMove:
            break;
    }
}

Вот как я создаю новый объект:

// create the new context
self.managedObjectContext = [NSManagedObjectContext MR_newMainQueueContext];

// setup default managed object context as parent
self.managedObjectContext.parentContext = [NSManagedObjectContext MR_defaultContext];

// Create new object
MyEntity *entity = [MyEntity MR_createEntityInContext:self.mangedObjectContext];

// set some properties
entity.sync = YES;  // important one, should be picked up my FRC
...

// save it
[self.managedObjectContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
    NSLog(@"saved the entity: %@", entity);
}];

Опять же это работает при развертывании через XCode. Если предположить, что я все делаю правильно, есть ли что-то другое в релизной версии, которая бы не работала? Что-то о CoreData или MagicalRecord в версии выпуска?

Я застрял, потому что я не вижу огонь didChangeObject при просмотре журналов в версии выпуска, но прекрасно работает в отладочной версии. Идеи???

1 ответ

Лично у меня были тупики при использовании основного контекста к основному контекстному отношению с MagicalRecord. Есть ли в этом смысл?

Если вам нужен отдельный контекст основного потока, вы всегда можете подключить его MR_rootSavingContext и прослушать изменения в корневом контексте, а затем объединить их вручную NSManagedObjectContextDidSaveNotification, Именно так rootContext и defaultContext настраиваются в MagicalRecord.

Я не предлагаю MR_mergeChangesOnMainThread потому что это вызвало слишком много тупиков в моем опыте и не так много внимания со стороны сопровождающих.

Самый простой способ, который я обычно использую, когда использую MagicalRecord с FRC, это использовать MR_defaultContext для отображения данных в потоке пользовательского интерфейса и создания / сохранения объектов в фоновом режиме MOC, т.е.

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    MyEntity *entity = [MyEntity MR_createEntityInContext:localContext];

    entity.sync = YES;
} completion:^(BOOL contextDidSave, NSError *error) {
   // check for errors
}];
Другие вопросы по тегам