ios - 核心数据设计模式

标签 ios objective-c design-patterns core-data repository

对于我的第一个 IOS 应用程序,我计划合并 CoreData,但是我有点不确定我应该使用的正确设计模式。

在我的应用委托(delegate)中,我有以下 3 个属性。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

我觉得使用这些对象的最佳方式是将它们注入(inject)到所有需要从 CoreData 内部访问数据的相关 View Controller 的构造函数中。

我能想到的最干净的方法是为我的数据模型中的每个表创建某种类型的 Repository 类,它将容纳上述 3 个对象并提供访问表数据的辅助方法,例如获取所有团队()。然后可以将这些存储库类注入(inject)到相关的 View Controller 中,而不是注入(inject)上面的所有 3 个对象。

在 CoreData 和 Objective-c 的世界里,这听起来像是正确的做法吗?

此外,创建这些存储库类的最佳方法是什么,我是否应该从 appDelegate(自动生成)中删除默认的核心数据代码和属性并将它们放入抽象存储库类中。

存储库的每个实例是否应该有自己的 NSPersistentStoreCoordinator、NSManagedObjectModel 和 NSManagedObjectContext 版本,或者这些对象的单个实例是否应该在 appDelegate 传入的所有存储库实例之间共享。

最佳答案

首先,Core-Data 设置的基本代码会让整个事情变得非常困惑。需要了解的是,Core-Data 是一种围绕各种数据库技术(sqlite、二进制、xml)的包装器,通过这样做,您无需直接接触数据库。一开始您要担心的主要类是 NSManagedObjectContext。将其视为底层数据库的快照,您可以随意修改它,完成后将 NSManagedObjectContext 写入数据库。您拥有的其他类实际上只需要更细粒度的低级别控制,并且由于这是您的第一个应用程序,最好不要管它们。你应该read this ,它很大,但你会从中获得很多理解,尤其是一切如何连接以及它们的作用。

总结一下:

  • 实际上,您只需要传递 NSManagedObjectContext
  • 你可以在每个 View Controller 中创建一个实例变量,或者,
  • 你不应该为每个应用制作超过一个,除非你真的需要,然后你需要确保将它们重新合并在一起
  • 你真的不需要创建所有对象的存储库,因为 NSManagedObjectContext 会为你做这个......有点......它会有条件地将对象加载到内存中,有很多事情要做这但是开始的地方是了解错误是什么(所有这些都在 NSManagedObjectContextNSManagedObject 下的 Apple 文档中)
  • 想想您的对象代表什么和做什么。您可以子类化 NSManagedObject 来表示您的 Core-Data 对象,并在其中放置逻辑和验证 - 非常方便。
  • 研究像 NSFetchRequestNSPredicate 这样的类,它们是从 NSManagedObjectContext 中获取对象的两个核心类。
  • 研究像 NSFetchedResultsController 这样的类,它可以很好地绑定(bind)到像 UITableView 这样的 UI 对象中。

最后,Core-Data 是一个野兽,您经常会发现自己一直在重复常见的任务。你应该看看this excellent framework它添加了各种帮助器(比如一个易于访问的 NSManagedObjectContext 实例,以及一行对象获取、创建、删除)。

关于ios - 核心数据设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188571/

相关文章:

java - Duck 实例策略模式 - Head first 设计模式

oop - OOP : multiple, 中的抽象但相当不同的上下文?

java - 仅使用静态方法对类进行依赖注入(inject)?

ios - 在当前事件的 UIViewController 中呈现 UIAlertController

ios - 以编程方式添加的按钮不起作用

IOS 应用程序 - 从后台模式重新打开应用程序

ios - 在 objective-c 中绘制人体

ios - 音频流 WiFi 到 WiFi - 广播

ios - 多个不同尺寸的自定义单元

objective-c - Objective C 的 future ?