核心数据设计模式

Ben*_*awk 6 design-patterns core-data objective-c repository ios

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

在我的应用程序委托中,我有以下 3 个属性。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
Run Code Online (Sandbox Code Playgroud)

我觉得使用这些对象的最好方法是将它们注入到所有需要从 CoreData 内部访问数据的相关视图控制器的构造函数中。

我能想到的最简洁的方法是为我的数据模型中的每个表创建某种 Repository 类,该类将容纳上述 3 个对象并提供用于访问表数据的辅助方法,例如 fetchAllTeams()。然后可以将这些存储库类注入到相关的视图控制器中,而不是注入上面的所有 3 个对象。

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

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

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

小智 3

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

总结一下:

  • 实际上你只需要传递NSManagedObjectContext
  • 您可以在每个视图控制器中创建一个实例变量,或者,
  • 每个应用程序不应该制作多个应用程序,除非您确实需要,然后您需要确保将它们合并在一起
  • 您实际上并不需要创建所有对象的存储库,因为NSManagedObjectContext这会为您...有点...它将有条件地将对象加载到内存中,这有很多内容,但首先要了解这是一个错误是(全部在 Apple 文档中NSManagedObjectContext或下NSManagedObject)
  • 想想你的对象代表什么和做什么。您可以子类化NSManagedObject来表示您的 Core-Data 对象,并在其中放置逻辑和验证 - 超级方便。
  • 查看NSFetchRequest和 等类NSPredicate,它们是从NSManagedObjectContext.
  • 研究一下这样的类NSFetchedResultsController,它们可以很好地与 UI 对象(如UITableView.

最后,Core-Data 是一个野兽,你经常发现自己一直在重复常见的任务。您应该研究一下这个优秀的框架,它添加了各种帮助程序(例如易于访问的实例NSManagedObjectContext,以及一行对象获取、创建、删除)。