UIManagedDocument сохранит, ну, в основном, когда это будет похоже; Вы не можете контролировать, когда это произойдет. Однако это, безусловно, сэкономит на завершении работы приложения, поэтому вы видите вставки при перезапуске.
В результате, хотя вы можете думать, что у вас есть постоянные идентификаторы объектов, они, скорее всего, временные и, следовательно, не могут быть получены. Простой дамп их через NSLog подтвердит это, так как идентификаторы временных объектов отображаются как таковые при регистрации.
Чтобы сделать их постоянными и пригодными для использования, попробуйте следующее после выполнения ваших дополнений. Предполагая, что у вас есть UIManagedDocument в качестве ивара:
- (void)performUpdate
{
NSManagedObjectContext * context = self.managedDocument.managedObjectContext;
NSSet * inserts = [context insertedObjects];
if ([inserts count])
{
NSError * error = nil;
if ([context obtainPermanentIDsForObjects:[inserts allObjects]
error:&error] == NO)
{
NSLog(@"BAM! %@", error);
}
}
[self.managedDocument updateChangeCount:UIDocumentChangeDone];
}
Очевидно, вы бы заменили обработку ошибок на что-то более лучшее здесь. UIManagedDocument теперь будет сохранять в какой-то момент в будущем (опять же, у вас нет абсолютно никакого контроля над тем, когда это произойдет, мы просто просим его сделать это в последней строке, так же, как это сделал бы менеджер по отмене) , но у вновь вставленных объектов теперь должны быть пригодные для использования постоянные идентификаторы, а выборки должны работать правильно.
И да, мне это тоже кажется немного странным, но это, кажется, правильный способ делать вещи с UIManagedDocument в игре.
Честно говоря, я хотел бы, чтобы кто-то сказал мне, что я ошибаюсь, и предоставил бы лучшее решение.