Что такое "правильный" способ использовать 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, но представленный основной метод является полезным дополнением к обсуждению в этом вопросе.

Другие вопросы по тегам