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
}];