Я использую NSManagedObjectContextObjectsDidChangeNotification, и у меня возникла проблема, когда после вставки объекта и последующего вызова отката, чтобы он был удален, уведомление об изменении с удаленным объектом вызывается дважды. Это неожиданное уведомление вызывает осложнения по линии, которую я проследил по этой проблеме. Я продемонстрировал пример Apple Earthquakes, чтобы продемонстрировать эту проблему. Редактирование:
- (void)viewDidLoad {
[super viewDidLoad];
[self reloadTableView:self];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(contextObjectsDidChangeNotification:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:self.managedObjectContext];
AAPLQuake* quake = (AAPLQuake *)[NSEntityDescription insertNewObjectForEntityForName:@"Quake" inManagedObjectContext:self.managedObjectContext];
NSLog(@"Why is deleted notified twice?");
[self.managedObjectContext rollback];
}
-(void)contextObjectsDidChangeNotification:(NSNotification*)notify{
NSLog(@"contextObjectsDidChangeNotification:");
NSDictionary* userInfo = notify.userInfo;
NSSet* inserted = userInfo[NSInsertedObjectsKey];
if(inserted){
NSLog(@"\tinserted %ld", inserted.count);
}
NSSet* deleted = userInfo[NSDeletedObjectsKey];
if(deleted){
NSLog(@"\tdeleted %ld", deleted.count);
}
}
Выполнение этого результата приводит к следующему выводу:
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] Why is deleted called twice?
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] inserted 1
2015-12-23 00:15:20.086 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.087 Earthquakes[7631:5431685] deleted 1
2015-12-23 00:15:20.087 Earthquakes[7631:5431685] contextObjectsDidChangeNotification:
2015-12-23 00:15:20.087 Earthquakes[7631:5431685] deleted 1
Пример доступного проекта здесь.
Кто-нибудь знает, почему это произойдет? Я испытываю это как на OS X 10.11.2, так и на iOS 9.2.