Что такое "правильный" способ использовать objectWithID NSManagedObjectContext:
Документы утверждают:
... Этот метод всегда возвращает объект. Предполагается, что данные в постоянном хранилище, представленные objectID, существуют - если это не так, возвращаемый объект выдает исключение при доступе к любому свойству (то есть при возникновении ошибки). Преимущество такого поведения заключается в том, что оно позволяет создавать и использовать ошибки, а затем создавать базовые строки позже или в отдельном контексте.
и в образце приложения Apple "Core Recipes" результат метода используется для заполнения NSFetchRequest, а затем используется результат запроса с комментариями на этот счет:
// first get the object into the context
Recipe *recipeFault = (Recipe *)[context objectWithID:objectID];
// this only creates a fault, which may NOT resolve to an object (for example, if the ID is for
// an objec that has been deleted already): create a fetch request to get the object for real
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity: [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:context]];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(self == %@)", recipeFault];
[request setPredicate: predicate];
Я видел много примеров (код другого и Apple 'iClass'), где результат от objectWithID
используется напрямую - это означает, что его свойства доступны и весело обрабатываются вместе.
Должен objectWithID
всегда рассматриваться как объект "возможно, это существует"?
Я спрашиваю, потому что я только что столкнулся с этим и не возился с его существованием.
2 ответа
Документация Apple говорит вам, что вы не должны предполагать, что объект существует как постоянное хранилище, просто потому, что объект возвращается.
Вы можете обращаться с ним так, как если бы он это делал, обращаясь к его свойствам и т. Д., Так как в фоновом режиме Core Data будет обращаться к хранилищу данных для обслуживания вашего запроса. Однако, если объект не существует в магазине, вы получите исключение.
Вот документация Apple, объясняющая ошибки (вот что objectWithID:
возвращается к вам).
Я нашел эту статью Безопасной выборки NSManagedObject по URI, который содержит удобный метод "все в одном" для захвата объекта с использованием objectWithID:
но если обнаружится, что это ошибка, идти вперед и получить ее. Подробно описанный метод идет немного дальше при работе с объектными URI, но представленный основной метод является полезным дополнением к обсуждению в этом вопросе.