Objective-C 替代使用 ApplicationDelegate 或单例来传递数据

标签 objective-c dependency-injection singleton uiapplicationdelegate

我正在开发一个现有的 iOS 应用程序(在 App 商店中称为 Mazin,如果有人感兴趣的话),我正在尝试重新编写代码以避免使用 Application Delegate 或单例来共享信息/方法。特别是我要在某些 View 和 Controller 之间共享以下内容:

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

一般来说,多个 View 和 ViewController 需要访问此信息的各个子集,我需要一种机制来在这些对象之间“全局”共享信息和方法。其中一些共享是为了方便(例如,每次我想显示一个基本事件指示器时,我只调用一个通用的“startActivityIndi​​cator”方法)但有些共享是必需的(例如,更改 gameMode 会“全局”更改它和几个 View / Controller 需要访问共模信息)。

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

谢谢!

最佳答案

我正在考虑的解决方案:

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

ApplicationDelegate 将是唯一生成“实用程序”类的单个实例并将这些实例传递给从其 Nib 加载的适当对象(在 applicationDidFinishLaunching 中)的类。这些 View / Controller 必须将所有必要的信息传递给它们可能以编程方式加载的任何成员(这可能会变得很麻烦——A 类可能需要 GagetsUtil 才能将其传递给 B 类的实例,即使 A 类从不直接使用该实用程序)。

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

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

关于Objective-C 替代使用 ApplicationDelegate 或单例来传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767476/

相关文章:

objective-c - Swift 中的 Objective C 委托(delegate)

iphone - EXC_BAD_ACCESS 访问 NSMutableData

backbone.js - 带有 RequireJS 的 Backbone 多页应用程序中的单例模型

python - python单例类可以继承吗?

swift - 无法读取单例对象的变量

iphone - 自动选择选择器行

Objective-C 隐式转换 obj-c 指针到自动释放 id<protocol> 错误

angular - Angular APP_INITIALIZER 工厂中的 InjectionToken

c# - 为 .NET 库找到正确的组合根

c# - 2层DI容器