NSManagedObject的属性引用是否不安全?

JRG*_*per 6 core-data ios

iOS的学习核心数据一书中,作者创建了几个UIViewControllers,每个都有一个引用的属性NSManagedObjectID.

在例子中,

@interface LocationAtShopViewController : UIViewController   
@property (strong, nonatomic) NSManagedObjectID *selectedObjectID;
// ... other properties and methods
@end
Run Code Online (Sandbox Code Playgroud)

以这种方式,他能够通过一个NSManagedObjectID从一个控制器到另一个和检索相关联的NSManagedObject使用对象NSManagedObjectContextexistingObjectWithID:error:方法.

此外,他不永远设置NSManagedObject直接对象(即使他已经有一个变量引用它),他也没有保持到一个参考NSManagedObject对象很长(相反,他检索它在每一个他需要的方法).

是否不安全(即在某些情况下会导致崩溃或导致意外行为)NSManagedObject通过属性引用直接在控制器之间传递,或者只是在控制器上保留对它的引用?

在例子中,

@interface LocationAtShopViewController : UIViewController   
@property (strong, nonatomic) LocationAtShop *locationAtShop;
// ... other properties and methods
@end
Run Code Online (Sandbox Code Playgroud)

假设使用单个共享,NSManagedObjectContext则忽略在多个上下文之间传递所导致的问题,这通常是不安全的.

Tom*_*ton 8

没有理由避免直接使用托管对象,前提是:

  • 您只能将托管对象与单个托管对象上下文一起使用
  • 你要么
    • 只在单个线程或队列上使用托管对象,或者
    • 确保使用performBlockperformBlockAndWait在处理其他队列时使用.

仅保留对象ID可能不太容易出错,因为它会使意外混淆上下文或队列变得更加困难.对于经验不足的开发人员来说,这可能是一个更好的主意,因此他们不太可能搞砸了.但保持对象本身肯定没有错,甚至特别危险.


JRG*_*per 5

安全吗?

是的,它是安全的,有一些警告:

根据Tom Harrington的回答,一般来说,将NSManagedObject一个属性存储在控制器上是安全的.

但是,有些情况会导致问题.值得注意的是,

如果删除引用的NSManagedObject并保存其上下文,则必须将该属性显式设置为nil.

如果将属性显式设置为nil,则下次尝试访问对象上的属性时,将导致CoreData could not fulfill a fault崩溃.

为什么iOS学习核心数据的作者传递并存储NSManagedObjectID而不是NSManagedObject?

可能的原因可能包括:

如果不是将存储的NSManagedObject属性存储为存储的属性NSManagedObjectID,则不必过多担心要删除的对象.

这是因为该NSManagedObjectContext方法existingObjectWithID:error:nil在以下情况下返回the object cannot be fetched, or does not exist, or cannot be faulted.

因此,如果可以删除对象,则存储属性比存储属性更安全.NSManagedObjectIDNSManagedObject