处理CoreData
managedObjectContexts
的首选方式是什么?为什么?
我经常看到三种不同的方式和奖励方式:
AppDelegate
中声明并让视图控制器依赖于AppDelegate sharedManager singleton class
Property on each view controller
并让父视图控制器设置它
显示category
的UIViewController的shared manageObjectContext
。
您认为每种方法的专业人士和合作伙伴是什么?
答案 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