iOS 管理域模型和 NSManagedObject 模型

Posted

技术标签:

【中文标题】iOS 管理域模型和 NSManagedObject 模型【英文标题】:iOS Managing Domain Model and NSManagedObject Model 【发布时间】:2017-09-24 06:45:15 【问题描述】:

我想知道如何管理我们的域模型和 NSManagedObject 模型。我的场景是我必须显示从 coredata 管理器类获取的 coredata 的最后 5 个 cmets,它返回 5 个 Comments (:NSManagedObject) 对象。现在我想从我们的服务器 API 中获取下 n 个 cmets,并将它们解析为我的域模型对象 Comments(继承自 NSObject)。

现在我有两种类型的对象,它们在逻辑上代表同一个对象。我想知道最佳实践/设计模式,我们应该如何处理/实现它。

一个明显的解决方案是遍历 NSManagedObject 模型并填充从 NSObject 派生的我的域对象的 5 个新模型,然后继续从我的 APIManager 类中获取这些对象。但我想知道最好的方法,如果有的话。

【问题讨论】:

为什么你有两种类型的 cmets?您应该对所有数据处理使用相同的 nsmanagedobject。但是为 ui 使用它们的视图模型副本。 我只想保存前 5 个 cmets,用户可以从服务器加载 100 个以上(如果有)但它们不会被缓存,那么为什么我应该将它们保存在 NSManagedObject 类中? 那你每次都需要去掉前5个cmets,换成新的coredata对象吗?听起来工作量很大。我猜为什么要使用 coredata。您可以实现一个内存缓存,仅将最后 5 个 cmets 保留在内存中并将其序列化到磁盘。如果您需要处理很多很多对象并且需要在 ui 更新方面表现出色,那么 Coredata 是很好的选择。在你的情况下,一个内存对象可能就足够了。 Coredata 更加复杂和有风险(对于线程安全等)。 你需要离线显示这些cmets吗?也许您可以完全跳过持久性并仅存储在内存中。您可以在每次启动应用程序时从 api 检索您的 cmets。让它们永远不会过时 是的,我需要离线显示这些 cmets,核心数据用于离线保​​存 feed 和用户连接,用户也可以在离线时执行一些操作,这些操作将在用户上线时更新。跨度> 【参考方案1】:

首先,CoreData 不是线程安全的,所以不要在控制器或视图中使用那些 cmets 对象。将核心数据隔离在单独的层中,并将这些对象转换为视图模型或其他形式的视图不可变结构。

其次,您可以在“provider”类中使用 nsfetched 结果控制器来自动通知您最后 5 个 cmets 是什么。代理可以通知您有关此提供程序数据何时更改的视图。

您可以使用您的 api ma 管理器在后台刷新您的服务器数据,当您取回数据时,将它们存储在 coredata 中。如果您使用的是 nsfetched 结果控制器,则无需执行任何其他操作,因为 coredata 会自动通知您设置的对象返回 cmets

【讨论】:

以上是关于iOS 管理域模型和 NSManagedObject 模型的主要内容,如果未能解决你的问题,请参考以下文章

CMMI简介及思想启发

全域安全:一种运行时安全管理模型

scim 跨域身份管理介绍

删除时如何手动管理Core Data关系

iOS - 使用 CoreData 的 dispatch_async 保留周期

Flutter 使用具有作用域模型的多个模型