CoreData - 在viewcontroller上使用AppDelegate,singleton或property for managedObjectContext?

时间:2014-03-03 11:58:05

标签: ios objective-c design-patterns core-data uiviewcontroller

处理CoreData managedObjectContexts的首选方式是什么?为什么?

我经常看到三种不同的方式和奖励方式:

  • AppDelegate中声明并让视图控制器依赖于AppDelegate
  • A sharedManager singleton class
  • Property on each view controller并让父视图控制器设置它

  • 显示category的UIViewController的shared manageObjectContext

您认为每种方法的专业人士和合作伙伴是什么?

3 个答案:

答案 0 :(得分:2)

  

AppDelegate中声明并让视图控制器依赖于AppDelegate

讨厌。不应涉及应用程序委托,因为数据模型不是应用程序级别委派活动。所有其他类都依赖于app委托也是不合适的。

Apple在示例代码中采用了这个选项,因为它很容易,但这并不是正确的。

  

sharedManager单例类

提供良好的知识管理,放置迁移逻辑的良好位置(如果在映射模型之外需要),并且可以远离应用程序中的任何远程同步方面抽象应用程序。

很多人不喜欢单身人士(全球国家),但他们确实有自己的用途。

  

每个视图控制器上的属性,让父视图控制器设置它

非常好 - 但取决于(根)父母从哪里获得MOC。

  

公开共享manageObjectContext

UIViewController类别

同样,取决于MOC的起源地。这比整个代码中的显式引用更好地隐藏了知识,但是交叉耦合到错误的类仍然很糟糕。

答案 1 :(得分:0)

我没有这些。

无论如何,站起来整个堆栈可能会花费相当多的时间,特别是如果涉及迁移。因此,我总是异步构造堆栈,并且已经完全建立了堆栈通知。

有兴趣的人可以收听通知,并在那个时间点开始使用堆栈。

大多数应用只有一个堆栈,可以在应用代理中启动。您可以在主视图控制器的viewDidLoad方法中监听通知(该方法已经解雇,但时间application:didFinishLaunchingWithOptions:已运行)。

在创建堆栈时,您可以获得响应式UI的额外好处。你唯一要做的就是确保没有数据的UI是合理的(这是一个更好的选择,而不是在加载堆栈时没有响应)。

答案 2 :(得分:0)

我的观点是你应该将堆栈移出AppDelegate并创建一个可以从AppDelegate启动的单独的类。如果愿意,可以在viewController层次结构中传递对此数据类的引用。这样,您的AppDelegate不对堆栈负责,您可以通过传入模拟数据对象来测试您的类。我想你想避免在视图控制器和AppDelegate之间创建依赖关系。您的ViewControllers不需要了解您的AppDelegate。这是完全不必要的依赖。将依赖项放在类别中也不能解决问题。通过在AppDelegate外部移动堆栈,您可以选择使堆栈类成为单例,如果您不想依赖AppDelegate来启动它。这是单例模式IMO的一个很好的用法。

这里有两个要点,第一个在Objc,第二个在Swift,应该让你开始。在斯威夫特,我直接让它成为单身人士。

https://gist.github.com/philosopherdog/4219a1b8f446acf8c8dc

https://gist.github.com/philosopherdog/cab11bb626f3bbe776a22ea408c900e1