【发布时间】:2012-01-27 12:05:07
【问题描述】:
所以在我看来,这里有一个 Catch-22 的情况。请注意以下关于应用程序架构的广泛(且巧妙)的立场:
- Apple(和大多数 alpha 开发人员)建议不要使用单例或访问应用程序委托单例来检索 NSManagedObjectContext。僵硬、糟糕的设计等等。好的——我同意!
- 遍历 UITabbarController 的子视图控制器并为每个子 VC 提供对上下文的引用(依赖注入)也是愚蠢的,因为您在应用程序启动时加载应用程序中的每个选项卡,只是为了传递一个引用。这也违背了 Apple 推荐的应用程序架构。
你如何解决这个问题?当视图控制器从笔尖唤醒时,您是否使用 NotificationCenter 发布通知,然后让应用程序委托传递上下文引用?这大概是我能想到的唯一一种方式,它同时适用于 #1 和 #2,但我也觉得这有点扭曲。
有没有更优雅的方式?
编辑:在初始化视图控制器时发出通知可能是一种竞争条件,因为如果您使用 Storyboard 进行操作,您的标签栏的子视图控制器往往会被初始化(尽管 sans-view加载)在发射。所以你必须在 viewDidLoad 中做这样的通知,这对于 MVC 约定来说是个坏主意。在用户执行与视图相关的任何操作之前,它还会束缚您对数据模型的任何操作(例如为性能而预先缓存)。
【问题讨论】:
-
遍历 UITabBarController 的视图控制器似乎还不错,因为 iOS 5 运行时似乎无论如何都会唤醒每个组件视图控制器。它只是不加载视图。
-
这已经有一段时间没有收到活动了。 @EricGoldburg 您在找到最佳实践方面取得了成功吗?
-
@MrJD:事实证明全世界都喜欢单例,即使很多开发者不喜欢。我最终在这个项目中使用了 RestKit,它抽象了传递上下文的需要,但它还在内部使用单例作为其对象加载器和托管对象处理类的默认情况。 C'est la vie。
-
我仍然不相信。在视图控制器之间传递并不难。在没有子类化的情况下通过选项卡控制器和导航控制器变得很困难,但我相信通过委托可以减少由于单例使用而导致的耦合。我想知道我是否会屈服。
-
我更加确信。我很感兴趣,因为我对从委托到选项卡到导航到视图控制器的传递时间感到恼火。您会强烈推荐下面的子类单例方法作为有效的替代方法吗?我注意到苹果强烈建议不要继承 NSManagedObjectContext
标签: objective-c cocoa-touch core-data