在书籍Learning Core Data for iOS中,作者创建了多个UIViewControllers
,每个NSManagedObjectID
都有一个引用@interface LocationAtShopViewController : UIViewController
@property (strong, nonatomic) NSManagedObjectID *selectedObjectID;
// ... other properties and methods
@end
的属性。
例如,
NSManagedObjectID
通过这种方式,他可以将NSManagedObject
从一个控制器传递到另一个控制器,并使用NSManagedObjectContext
的{{1}}方法检索关联的existingObjectWithID:error:
对象。
此外,他没有 永远 直接设置NSManagedObject
对象(即使他已经有一个变量引用),也没有保留对NSManagedObject
对象的引用很长(相反,他会在他需要的每个方法中检索它)。
不安全(即在某些情况下会导致崩溃或导致意外行为)通过属性引用直接在控制器之间传递NSManagedObject
,或者只是保留对它的引用在控制器上?
例如,
@interface LocationAtShopViewController : UIViewController
@property (strong, nonatomic) LocationAtShop *locationAtShop;
// ... other properties and methods
@end
假设使用单,则使用共享NSManagedObjectContext
,因此请忽略因在多个上下文之间传递而导致的问题,这通常不安全。
答案 0 :(得分:8)
没有理由避免直接使用托管对象,前提是:
performBlock
或performBlockAndWait
。仅保留对象ID可能不太容易出错,因为它会使意外混淆上下文或队列变得更加困难。对于经验不足的开发人员来说,这可能是一个更好的主意,因此他们不太可能搞砸了。但保持对象本身肯定没有错,甚至特别危险。
答案 1 :(得分:5)
是的,它是安全的,有一些警告:
根据Tom Harrington的回答,一般将NSManagedObject
作为属性存储在控制器上是安全的。
但是,有些情况会导致问题。值得注意的是,
如果删除引用的NSManagedObject并保存其上下文,则必须将该属性明确设置为nil。
如果 不 将属性显式设置为nil
,则下次尝试访问对象的属性时,会导致{ {1}}崩溃。
可能的原因可能包括:
如果不是将CoreData could not fulfill a fault
存储为存储NSManagedObject
的属性,而是不必过多担心要删除的对象。
这是因为NSManagedObjectID
的方法NSManagedObjectContext
会在existingObjectWithID:error:
的情况下返回nil
。
所以, 更安全 将the object cannot be fetched, or does not exist, or cannot be faulted
存储为属性,而不是存储NSManagedObjectID
,如果对象的删除是可能的。