在iOS应用程序中共享数据的方式是什么?

时间:2012-09-17 06:26:10

标签: ios singleton nsuserdefaults appdelegate

我正在开发的应用程序有10个控制器。我想在设置屏幕中将一些状态信息共享给5个控制器。以下选项的最佳策略是什么:

  1. 使用NSUserdefaults存储状态信息并使用它。
  2. 将状态信息存储在AppDelegate实例中并在相关控制器中使用
  3. 使用单例实例维护状态信息并在相关控制器上使用
  4. 哪一个更好?如果还有其他选择,请告诉我。

1 个答案:

答案 0 :(得分:2)

NSUserDefaults解决方案并不是一个糟糕的解决方案,至少如果这些值真的会自然而然地结束。当然forget about the singleton idea,不管是单独的单例类还是app委托。


还有另一种可能性,即减少控制器之间的耦合。而不是依赖于将设置公开为属性的一个特定类,而是将所需的设置作为各个控制器上的属性:

@interface Controller : UIViewController
@property(assign) NSUInteger logLevel; // a sample setting
@end

然后有一个单独的类(让我们称之为Factory),它将负责创建控制器。工厂会记录所有设置并将控制器传递给它所需的设置。 (有sample Xcode project on GitHub显示工厂方法,但目前它不包含此特定问题的示例。)

此解决方案的优点是松耦合,您不需要额外的对象(app委托,NSUserDefaults实例或某些Settings类实例)来调整控制器的行为。缺点是更详细的控制器API。是否选择此方法取决于您的设置的性质。

当然,也可以提出一种混合解决方案。创建一个Settings类,它将保留所有设置,使用一个不错的API(不再需要-objectForKey:调用)公开它们,并向所有控制器共享指向Settings对象的指针。您不需要单例,请参阅上面链接的GitHub示例代码。这意味着更紧密的耦合,但界面的冗长度更低。