gpt4 book ai didi

iphone - 将模型层基于 NSManagedObject 的负面后果是什么(如果有的话)?

转载 作者:行者123 更新时间:2023-11-28 18:43:38 25 4
gpt4 key购买 nike

我现在做 iOS 已经两年了,主要是因为简单的数据层(不需要 ID、连接、复杂查询等),我总是通过扩展 NSObject 手动管理持久性,符合NSCoder,并将我的数据保存在平面文件中。

但是,现在我需要开始做更复杂的查询工作,并且我正在深入研究 CoreData。

我现在挂断的是 NSManagedObject。这是一个非常令人生畏的类(class),我想知道是否有任何我应该注意的不成文的陷阱可能会限制我在构建复杂应用程序时的自由。

例如,@dynamic getter/setter 之类的东西对我来说不是很清楚,等等

所以:

1) NSManagedObject 是否有任何功能会阻止我像处理 NSObject 一样处理自定义类的实例?

2) 在没有 ManagedObjectContext 的情况下处理对象时,NSManagedObject 是否有任何异常行为?

3) 我可以用我自己的自定义 getter/setter 替换 @dynamic 属性声明而不需要太多痛苦吗?我使用大量自定义 setter 来执行业务逻辑。

等等,等等。

谢谢

最佳答案

小心!

Core Data 不是轻量级的。这将需要对对象的工作方式进行大量更改,除非它们非常基础。

1) Are there any features of NSManagedObject that would prevent me from handling instances of custom classes just as I would with NSObject?

错误和托管对象的生命周期有点难以理解。您的对象几乎随时都可能“出错”(无论如何事件循环的每次迭代),这使它们失去任何非持久状态。当它们“无故障”时,它们无权访问托管对象上下文之外的任何内容来恢复它们的状态。托管对象很难访问托管对象上下文之外的任何内容。

transient 属性是可能的,但非常限于可以从持久属性计算的事物,因为如果对象出现故障,它们的状态将丢失。您还必须正式声明您正在数据模型中使用 transient 属性。尝试只设置实例变量会遇到问题。

所以基本上托管对象的属性都必须是持久的或与持久属性相关。查看您计划管理的对象。将它们的所有实例变量放入持久存储中是否可行且可取?如果不是,事情就不会那么简单。您可能在 init.d 中设置了实例变量。每次程序为托管对象运行时都不会调用 init。有 awakeFromInsert 和 awakeFromFetch,但它们的工作方式与 init 不同。您的代码调用 init 并可以传递参数。框架调用 awake 并且它没有获取任何参数。

线程是另一个需要考虑的问题。建议仅由单个线程使用托管对象上下文以及其中的托管对象。如果您有多个线程,并且它们需要访问您的模型,则您需要创建包含托管对象副本的重复托管对象上下文。 Core Data 的设计目的是在不给内存、磁盘 I/O 和处理器带来太多压力的情况下处理这个问题,但从编码的角度来看,它并不轻量级。

2) Does NSManagedObject have any unusual behavior when objects are handled WITHOUT the presence of a ManagedObjectContext?

没有托管对象上下文就不能拥有托管对象。

这通常不是问题。托管对象携带指向其托管对象上下文的指针。虽然它可能有点限制。如果模型外部的某些东西需要创建模型对象作为模型的输入,则它需要访问托管对象上下文才能执行此操作。希望这将通过某种抽象层进行,因此它不需要知道它正在处理核心数据,但你不能只给它一个类并让它分配/初始化。在不同的托管对象上下文之间移动托管对象也需要一些工作。

3) Can I supplant a @dynamic property declaration with my own custom getter/setter without too much pain? I use a lot of custom setters to enforce business logic.

是的。这有点复杂但可行。您编写自己的访问器。除了您的业务逻辑之外,它们还必须调用键值观察方法,例如 willChangeValueForKey:。然后使用原始访问器访问数据。

关于iphone - 将模型层基于 NSManagedObject 的负面后果是什么(如果有的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com