在基于导航的应用程序中使用 Core Data 时,我如何(应该?)在 UITableViews 之间传递上下文?
Posted
技术标签:
【中文标题】在基于导航的应用程序中使用 Core Data 时,我如何(应该?)在 UITableViews 之间传递上下文?【英文标题】:How do I (should I?) pass the context between UITableViews when using Core Data in a navigation based application? 【发布时间】:2011-05-29 17:42:21 【问题描述】:我有一个基于导航的应用程序,它使用 Core Data 和多个级别的向下钻取导航。在导航的最后一级,我将记录添加到托管对象存储中。在每一级导航中,我为下一个 UITableView 创建了一个视图控制器数组。
我的问题涉及创建 managedObjectContext、managedObjectModel 和 persistentStoreCoordinator 的核心数据堆栈方法的位置。
我是否在需要从 persistentStore 获取数据的***别视图控制器中创建这些方法,然后将上下文对象传递给较低级别的视图控制器?我还需要通过协调员吗?
许多问题似乎指向将这些方法放在 App Delegate 中,但随后许多答案说“不要”将它们放在 App Delegate 中。那么这些方法的最佳位置在哪里?需要传递哪些对象以允许从数据存储中获取所有必要的级别?
【问题讨论】:
【参考方案1】:首先,一些先决条件:
如果您正在构建一个使用 Core Data 的应用程序,那么您很可能会遇到需要拥有多个托管对象上下文 (MOC) 的情况。但是,您将需要一个能够在整个应用程序会话中“存活”的 MOC。将其称为您的主 MOC (因为您只能从主线程访问它!)。
根据您的应用程序,您可能还会遇到需要多个 NSPersistentStoreCoordinator 的情况。在我的回答中,我将坚持需要一个协调员的情况。至于您的 NSManagedObjectModel,这完全取决于您的应用程序。通常,您只需要其中之一。
回答您的问题:
我建议让 AppDelegate 拥有您的主 MOC,因为后者是一个单例,只要应用程序存在,它就会存在。您可以将创建/保存主 MOC 的方法放在 AppDelegate 中,或者将这些任务委托给实用程序类。我发现第二个选项更简洁一些,因为您可以使用该实用程序类添加动态创建其他 MOC 的方法,或者从应用程序中的任何控制器获取对主 MOC 的引用.这样,您就可以避免一直调用 AppDelegate。
还请注意,如果您已经拥有NSManagedObject
,您可以通过调用[yourManagedObject managedObjectContext]
来获取它所注册的MOC 的引用。获得 MOC 参考后,您可以获得相关的 NSPersistentStoreCoordinator
和 NSManagedObjectModel
参考。 (这是为了回答您关于“传递协调器”的问题:我更喜欢使用 NSManagedObject
s 和 NSManagedObjectContext
,因为它们处于抽象的最顶层,而不是传递协调器或模型) .
希望这会有所帮助!
【讨论】:
谢谢,关于从对象获取上下文的部分很有意义。我没想到。【参考方案2】:Apple 将 Core Data 堆栈放在适用于大多数情况的应用程序委托中。
在我看来,您正在使用 Core Data。听起来您的应用程序设计只是在您通过数组填充的视图层次结构之后使用 Core Data 来保存一些数据。虽然你可以完成这项工作,但你失去了 Core Data 的很多自动功能。
Core Data 主要不是保存数据。相反,它是用于在模型-视图-控制器设计应用程序中创建模型层的 API。因此,Core Data 通常包含应用程序的实际逻辑“胆量”。 Apple 将堆栈放在应用程序委托中,因为它假定 Core Data 将在整个应用程序中使用。
在标准设计中,您将使用 Core Data 来填充所有视图,因此您需要 Core Data 位于任何层次结构的顶部和底部。
【讨论】:
我启动了应用程序,只是调用了一个存储所有应用程序数据的 SQLite 数据库。目前,我已经将 sqllite 分布在整个应用程序中,并且刚刚添加了核心数据来跟踪用户数据。我需要重构整个应用程序以使用 Core Data。感谢您的建议。以上是关于在基于导航的应用程序中使用 Core Data 时,我如何(应该?)在 UITableViews 之间传递上下文?的主要内容,如果未能解决你的问题,请参考以下文章