Objective-C使用ApplicationDelegate或singleton传递数据的替代方法

时间:2012-01-07 04:54:59

标签: objective-c dependency-injection singleton uiapplicationdelegate

我正在开发一个现有的iOS应用程序(在App Store中称为Mazin,如果有人感兴趣的话),我正在尝试重做代码以避免使用Application Delegate或单例来共享信息/方法。特别是我有以下内容可以分享某些视图和控制器:

  • CoreData对象,如NSManagedObjectConttext和用于与数据交互的相关自定义方法
  • 在currentMazeType,gameMode和soundIsMuted等几个地方使用的州属性,以及一些广泛使用的游戏专用方法
  • 用于显示整个应用程序中常用信息的视图和方法(例如,ActivityIndi​​cator以及在给定视图上显示/隐藏它的方法)

通常,几个视图和ViewControllers需要访问此信息的各种子集,我需要一种机制来跨这些对象“全局”共享信息和方法。这种共享中的一些是为了方便(例如,每次我想显示基本活动指示符时,我只是调用一个常见的“startActivityIndi​​cator”方法)但有些是必需的(例如,更改gameMode将其“全局”更改为多个视图/控制器需要访问共模信息。)

哪种模式最适合此要求?我有自己的解决方案,我会在下面发布以供您考虑/评论。

谢谢!

2 个答案:

答案 0 :(得分:2)

解决方案我在考虑:

我计划创建一些“实用程序”类(例如GameDataUtil,AppStateUtil,GadgetsUtil),每个类封装“全局”信息和/或方法的适当子集。需要访问实用程序中的公共信息/方法的每个View或ViewController将具有该给定类型的适当属性(例如,可以使声音需要访问AppStateUtil的视图,以便它可以确定声音当前是否已静音)

ApplicationDelegate将是唯一一个生成“实用程序”类的单个实例的类,并将这些实例传递给从其Nib加载的相应对象(在applicationDidFinishLaunching中)。那些视图/控制器必须将所有必要的信息传递给他们可能以编程方式加载的任何成员(这可能会变得毛茸茸 - 类A可能需要GagetsUtil才能将它传递给B类的实例,即使A类从不直接使用该实用程序。)

这有点像从应用程序委托中注入依赖项(因为我没有依赖注入容器的实用程序)。

现在,我已经考虑过创建一个uber-utility(例如,ConfigUtil),它将为每个其他实用程序保存一个属性。 AppDelegate将创建一个uber-utility的单个实例(使用它创建的其他实用程序的实例进行设置)。 AppDelegate会将uber-utility实例传递给任何需要访问任何基本实用程序的人。每个基本实用程序仍然会封装一个公共数据/方法的子集,但是通过将其中一个放入一个超级实用程序并传递它,我不必跟上哪个类需要哪个实用程序(不仅是为了自己的使用,而且还传递给它的任何成员对象。)

对该计划有任何想法或建议吗?非常感谢提前!

答案 1 :(得分:0)

NSNotification距离该模型只有一步之遥,通常很容易实现。

如果现在有很多事情知道并引用可变的全局数据......撤消它会花费时间。

<强>更新

我记得我曾写过a more detailed response to a similar scenario here at SO