是否可以 return NSManagedObjects 在 Core Data 中设为只读?

Is it possible to return NSManagedObjects as read-only in Core Data?

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

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

我已经看到很多关于创建完全只读存储的参考资料(如此处:Unable to create a readonly sqlite store in Core Data: Cocoa Error 260),但我不希望 NSPersistentStore 本身是只读的(模块 I' m writing 应该可以写吧)。

一种选择是将托管对象转换为具有相同属性的普通 NSObject 子类。但是后来我失去了一些 Core Data 可以做的好事,比如延迟加载等。

有什么想法吗?

NSManagedObject 本身不支持只读状态,所以这不是一件小事。不过,您可以做一些稍微有点棘手的事情来获得您描述的内容。

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

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