文档声明:
...此方法始终返回一个对象。 持久性存储中的数据 假设由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
总是将视为“可能存在”这个对象吗?
我在问,因为我刚刚遇到这种情况,并没有反对它的存在。
答案 0 :(得分:4)
Apple文档告诉您的不是假设对象存在的是持久性存储,仅仅因为返回了一个对象。
您可以像对待它一样对待它,访问其属性等等,因为在后台Core Data将访问数据存储来为您的请求提供服务。但是,如果商店中不存在该对象,则会出现异常。
Here's Apple's documentation explaining faults(这是objectWithID:
返回给你的东西)。
答案 1 :(得分:1)
我发现这篇文章Safely fetching an NSManagedObject by URI包含了一个很好的一对一方法,用于使用objectWithID:
抓取一个对象,但是如果发现它是一个错误,那就继续获取它。该方法详细介绍了处理对象URI,但所提出的核心技术是该问题讨论的有用扩展。