【问题标题】:Create my own Core Data Stack's advantages and usage创建自己的Core Data Stack的优势和使用
【发布时间】:2015-02-02 18:01:54
【问题描述】:

背景:最近我正在阅读“CoreData by tutorials”来学习 Core Data。这本书向我展示了如何在代码中创建新的核心数据堆栈,并鼓励我们这样做。
问题:

  1. 为什么我需要编写一个新类来处理 Core Data Stack 而不是使用 XCode 在 AppDelegate.swift 中提供给我们的代码,这样做有什么好处吗?
  2. 本书获取ManagedObjectContext的方法是通过segue将之前的上下文传递给当前的Controller。就像,首先我在AppDelegate.swift 中初始化一个上下文,然后将此值传递给topViewController (A) of self.window!.rootViewController as UINavigationController 中名为“context”的属性。其次,如果我想在控制器B中使用上下文,我需要在B中声明一个名为“context”的属性,并通过segue传递A的上下文属性
    let dest = segue.destinationViewController as B dest.context = self.context
    这是使用上下文的唯一方法吗?我宁愿使用
    if let context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext 到处获取上下文..
  3. 如果我想使用模型来管理 Core Data 之类的事情,例如从控制器传递“上下文”以初始化我的模型类,这是正确的方法吗?

谢谢!

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:
    1. 关注点分离。如果没有仔细管理,应用程序委托很快就会成为初始化应用程序部分的一站式商店,这会降低可读性/可维护性;
    2. 就个人而言,我发现将 MOC 传递给控制器​​很乏味且容易出错。在大型项目中,我更喜欢使用 RestKit: [[RKManagedObjectStore defaultStore] mainQueueManagedObjectContext] 中的单例;
    3. 如果我理解正确,您是在问如何创建NSFetchRequest 实例?如果是这样,那么是的,您将 MOC 用于主队列(无论是作为属性传递给控制器​​还是通过其他方式传递给控制器​​都是实现细节)。

    【讨论】:

    • 至于 Q2,假设我创建了一个“MyCoreDataStack”类,我可以为每个控制器初始化实例以获取 MOC 而不是传递它吗?创建许多 MOC 有什么害处?非常感谢!
    • 创建多个 MOC 并没有什么问题,但是请注意,一个上下文中的托管对象对于该上下文来说是唯一的。简而言之,这意味着除非您在跨上下文使用托管对象时非常小心(并且知道规则),否则不要这样做。在您的情况下,我建议将一个 MOC 用于主线程,并在您的控制器中使用该单个 MOC。您可能还会发现这篇文章很有帮助objc.io/issue-4/core-data-overview.html
    • 很有帮助!谢谢:)
    猜你喜欢
    • 2011-06-27
    • 2017-05-08
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多