什么是使用NSManagedObjectContext的objectWithID的“正确”方法:

时间:2011-01-27 15:49:32

标签: cocoa core-data 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 个答案:

答案 0 :(得分:4)

Apple文档告诉您的不是假设对象存在的是持久性存储,仅仅因为返回了一个对象

您可以像对待它一样对待它,访问其属性等等,因为在后台Core Data将访问数据存储来为您的请求提供服务。但是,如果商店中不存在该对象,则会出现异常。

Here's Apple's documentation explaining faults(这是objectWithID:返回给你的东西)。

答案 1 :(得分:1)

我发现这篇文章Safely fetching an NSManagedObject by URI包含了一个很好的一对一方法,用于使用objectWithID:抓取一个对象,但是如果发现它是一个错误,那就继续获取它。该方法详细介绍了处理对象URI,但所提出的核心技术是该问题讨论的有用扩展。