Objective-C 替代使用 ApplicationDelegate 或单例传递数据
Posted
技术标签:
【中文标题】Objective-C 替代使用 ApplicationDelegate 或单例传递数据【英文标题】:Objective-C Alternative to using ApplicationDelegate or singleton to pass data 【发布时间】:2012-01-07 04:54:59 【问题描述】:我正在开发一个现有的 ios 应用程序(如果有人感兴趣,在应用商店中称为 Mazin),我正在尝试重新编写代码以避免使用 Application Delegate 或单例来共享信息/方法。特别是,我在某些视图和控制器之间共享以下内容:
CoreData 对象,如 NSManagedObjectContext 和用于与数据交互的相关自定义方法 在一些地方使用的状态属性,例如 currentMazeType、gameMode 和 soundIsMuted,以及一些广泛使用的游戏专用实用方法 用于显示整个应用中常用信息的视图和方法(例如,ActivityIndicator 和在给定视图上显示/隐藏它的方法)一般来说,几个视图和 ViewControllers 需要访问这些信息的各种子集,我需要一种机制来在这些对象之间“全局”共享信息和方法。有些共享是为了方便(例如,每次我想显示一个基本活动指示器时,我只调用一个常见的“startActivityIndicator”方法),但有些是必需的(例如,更改 gameMode 会“全局”更改它和几个视图/控制器需要访问共模信息)。
哪种模式最适合此要求?我有自己的解决方案,我会在下面发布以供您考虑/cmets。
谢谢!
【问题讨论】:
在我发布我的问题 8 小时后才能发布我自己的答案,但我会在早上发布。一般来说,我可以创建实用程序类来保存公共数据/方法,让应用程序委托创建每个实用程序类的唯一实例,然后让代理将它们(如依赖项)传递给适当的成员对象(谁会传递它们作为其子对象的依赖项,依此类推)。当我可以回答我自己的问题时,更多细节。 【参考方案1】:我正在考虑的解决方案:
我计划创建一些“实用程序”类(例如 GameDataUtil、AppStateUtil、GadgetsUtil),每个类都封装了“全局”信息和/或方法的适当子集。每个需要访问实用程序中的公共信息/方法的 View 或 ViewController 都将具有该给定类型的适当属性(例如,可以发出声音的视图需要访问 AppStateUtil 以便它可以确定声音当前是否静音) .
ApplicationDelegate 将是唯一生成“实用程序”类的单个实例并将这些实例传递给从其 Nib 加载的适当对象的类(在 applicationDidFinishLaunching 中)。这些视图/控制器必须将所有必要的信息传递给他们可能以编程方式加载的任何成员(这可能会变得很麻烦——A 类可能需要 GagetsUtil 才能将其传递给 B 类的实例,即使 A 类从不直接使用该实用程序)。
这有点像从应用程序委托向下注入依赖项(因为我没有依赖注入容器的实用程序)。
现在,我考虑过创建一个超级实用程序(例如 ConfigUtil),它会为每个其他实用程序保存一个属性。 AppDelegate 将创建 uber-utility 的单个实例(使用它创建的其他实用程序的实例设置它)。 AppDelegate 会将 uber-utility 实例传递给需要访问任何基本实用程序的任何人。每个基本实用程序仍将封装公共数据/方法的子集,但是通过将每个实用程序中的一个放入超级实用程序并传递它,我不必跟上哪个类需要哪个实用程序(不仅供自己使用,还可以传递给它的任何成员对象)。
【讨论】:
认真的吗?我在其他帖子中看到了相反的建议——不要在编辑中回答你自己的问题,因为那样你不是在问问题,而是在问 cmets。我问了我的问题,并希望其他人会提出解决方案。这是我目前对解决方案的想法,其他人可以发表评论或提供完全不同的答案。 我明白你在说什么。感谢您的评论。我将其视为一种解决方案(例如,如果有人来阅读我的问题,发现它对他们的情况有用,然后想查看解决方案,我的帖子可能是一个解决方案)。但我也在寻找反馈——这样我就可以看到在哪里进行编辑也可能是合适的。 @FTLPhysicsGuy 我现在记得在 SO 的另一个答案中详细介绍了一种方法来重排程序 - 链接在我更新的答案中。 看到了链接。另一个帖子的回复很好——我把它加起来了。 这是一个依赖注入容器:github.com/jasperblues/spring-objective-c【参考方案2】:NSNotification
与该模型相距甚远,而且通常很容易实现。
如果现在很多事情都知道并引用了可变的全局数据......这需要时间来撤消。
更新
我记得我写过a more detailed response to a similar scenario here at SO。
【讨论】:
感谢您的回复。我在应用程序中使用通知 - 通常在模型更改时通知控制器 - 我认为如果对象需要在设置更改时采取行动,这是一个合理的解决方案。但是,如果控制器需要更改设置本身,它显然需要更直接的访问。此外,如果控制器在更改发生时不需要采取行动,但需要在未来某个时间知道设置的当前值,则通知可能不是正确的答案。以上是关于Objective-C 替代使用 ApplicationDelegate 或单例传递数据的主要内容,如果未能解决你的问题,请参考以下文章
radiansToVector 和 randomInRange Objective-C 函数的 Swift 替代方案是啥? [关闭]
将 Node.js+Socket.io 包装成 OSX 可执行文件的可靠方法? (或用作替代品的 C/C++/Objective-C 库)