在iOS的学习核心数据一书中,作者创建了几个UIViewControllers,每个都有一个引用的属性NSManagedObjectID.
在例子中,
@interface LocationAtShopViewController : UIViewController
@property (strong, nonatomic) NSManagedObjectID *selectedObjectID;
// ... other properties and methods
@end
Run Code Online (Sandbox Code Playgroud)
以这种方式,他能够通过一个NSManagedObjectID从一个控制器到另一个和检索相关联的NSManagedObject使用对象NSManagedObjectContext的existingObjectWithID:error:方法.
此外,他不永远设置NSManagedObject直接对象(即使他已经有一个变量引用它),他也没有保持到一个参考NSManagedObject对象很长(相反,他检索它在每一个他需要的方法).
是否不安全(即在某些情况下会导致崩溃或导致意外行为)NSManagedObject通过属性引用直接在控制器之间传递,或者只是在控制器上保留对它的引用?
在例子中,
@interface LocationAtShopViewController : UIViewController
@property (strong, nonatomic) LocationAtShop *locationAtShop;
// ... other properties and methods
@end
Run Code Online (Sandbox Code Playgroud)
假设使用单个共享,NSManagedObjectContext则忽略在多个上下文之间传递所导致的问题,这通常是不安全的.
没有理由避免直接使用托管对象,前提是:
performBlock或performBlockAndWait在处理其他队列时使用.仅保留对象ID可能不太容易出错,因为它会使意外混淆上下文或队列变得更加困难.对于经验不足的开发人员来说,这可能是一个更好的主意,因此他们不太可能搞砸了.但保持对象本身肯定没有错,甚至特别危险.
是的,它是安全的,有一些警告:
根据Tom Harrington的回答,一般来说,将NSManagedObject一个属性存储在控制器上是安全的.
但是,有些情况会导致问题.值得注意的是,
如果删除引用的NSManagedObject并保存其上下文,则必须将该属性显式设置为nil.
如果未将属性显式设置为nil,则下次尝试访问对象上的属性时,将导致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.
因此,如果可以删除对象,则存储属性比存储属性更安全.NSManagedObjectIDNSManagedObject
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |