是否可以在Core Data中将NSManagedObjects作为只读方式返回?

时间:2015-10-22 23:00:29

标签: ios xcode core-data nsmanagedobjectcontext

我使用Core Data在我正在编写的模块中缓存服务器数据,并且希望能够强制执行应用程序的其他部分不修改该数据。< / p>

是否可以将我的NSManagedObject实例或用于获取它们的NSManagedObjectContext标记为只读?由于可以直接从对象访问上下文,因此消费者可以自由修改对象并调用[obj.managedObjectContext save:&errror]

我已经看到很多关于创建一个完全只读的商店的引用(比如这里:Unable to create a readonly sqlite store in Core Data: Cocoa Error 260),但我不希望NSPersistentStore本身是只读的(模块)我写作应该能够写到它。)

一种选择是将托管对象转换为具有相同属性的普通NSObject子类。但是后来我失去了一些像Core Data这样的延迟加载等好东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

NSManagedObject不支持自己的只读状态,所以这不是一件小事。但是,你可以采取一些略微讨厌的东西来获得你所描述的东西。

  • 如果您使用的是NSManagedObject的自定义子类,则可以向类(而不是实体)添加布尔readOnlyMode属性。然后你可以覆盖setter方法来检查这个属性,然后再做任何事情。您将获得每个对象的只读行为,但没有什么可以阻止应用程序的其他部分只是更改该值。
  • 你可以在NSManagedObjectContext本身做类似的事情。创建您自己使用的子类,并添加一个类似的readOnlyMode属性,在调用save:时检查该属性。但任何人都可以改变这面旗帜。

或者你可以用苛刻的方式做到这一点。在您自己的控制器类中使用布尔readOnly变量。然后听NSManagedObjectContextObjectsDidChangeNotification。如果该通知在只读模式下到达,则会使应用程序崩溃。如果应用程序的其余部分由表面上与您在同一团队中的人员开发,这应该是完全合理的,因为它只会在应用程序开发期间在内部发生。