医生说:
如果对象未在上下文中注册,则可以获取该对象或 作为一个错误返回。此方法始终返回一个对象。中的数据 假定objectID表示的持久存储是存在的 - 如果存在的话 如果没有,返回的对象在您访问any时会抛出异常 属性(即故障发生时)。这样做的好处 行为是它允许您创建和使用故障,然后创建 基础数据稍后或在单独的上下文中。
我正在考虑最后一句:
此行为的好处是,它允许您创建和使用故障,然后在以后或在单独的上下文中创建基础数据。
这是否意味着我可以使用objectWithID:
与任意ID
来获取不存在的对象的错误句柄,然后再使用ID
创建对象?但是如何为新对象分配任意ID
?
答案 0 :(得分:2)
通常,是的,您可以获取非现有项目的句柄,稍后创建该项目
但是,由于您不知道将为该项目分配什么ID,因此在这种情况下这些并不十分有用。
您可以使用obtainPermanentIDsForObjects:error:
来获取对象的最终ID,但这是商店之旅,会有性能损失。
您可以使用objectWithID:
来“预热”协调器缓存。通过这种方式,您可以在后台获取对象,并在另一个上下文中使用此方法,然后访问这些项目而不会访问商店(性能更好)。
答案 1 :(得分:0)
由于每个NSManagedObjectID
必须最初来自一个已完成的NSManagedObject
并且无法从头开始创建一个,因此“以后创建基础数据”的唯一可行方法是没有意义的,如下所示:
NSManagedObjectID *objID = object.objectID;
[moc deleteObject:object];
…
object = [moc objectWithID:objID]; // Deleted so non-existing
[moc insertObject:object]; // Kinda of resurrecting the deleted object, but not really since the data are gone only ID is left. So it is creating a new object with the old ID. But what's the point?
// Fill data into object
…
[moc save:NULL];
答案 2 :(得分:-1)
如果您使用-objectWithID:
,它将返回错误如果该对象尚未在托管对象上下文中注册(即,仅当对象尚未被提取时并没有被指责。)在它确实返回错误的情况下,您不需要做任何事情来“创建对象”。只需访问对象的属性,就会自动触发故障并让您访问其数据。您无需额外的工作来创建其他对象。