最佳实践 - 全局访问首选项

时间:2010-03-24 06:00:07

标签: iphone cocoa cocoa-touch

我的应用的用户首选项存储在NSUserDefaults中。这包括“主题”首选项,需要经常由多个类访问。我不想反复调用“[[NSUserDefaults standardUserDefaults] objectForKey:...”,因为它会产生不一致的代码,我认为会产生开销。在任何课程中访问偏好的首选和最简洁的方法是什么?

3 个答案:

答案 0 :(得分:5)

访问用户首选项的首选方式是您执行此操作的方式,这很难实现。在实际注意到它之前,你不应该假设开销。

也就是说,考虑在启动时从用户首选项中读取主题值,然后将相应的主题设置存储在主题对象中。然后,当您调用它们的方法时,您可以将此主题对象传递给各个类,并且它们可以使用它。作为奖励,无论用户设置如何,您最终都能够传递任意主题对象,允许您在主题选择界面中使用其输出进行主题预览,假设这些类涉及用户可见的输出。需要考虑的事情。

答案 1 :(得分:3)

开销很小,根本不重要。其余的是设计和平衡的问题。从设计角度解决此问题的“正确”方法是通过在类接口中公开插座来使对用户默认值的依赖性可见:

@interface ClassThatUsesSomethingFromDefaults : NSObject {
    NSUserDefaults *prefs;
}

@property(retain) NSUserDefaults *prefs;

这种方式很明显,这个类的行为因用户默认值而异,这是一件好事。它还使您更容易使用类中的默认值(调用prefs而不是[NSUserDefaults standardUserDefaults])。并且它可以更容易地将类与系统的其余部分隔离开来 - 您可以使用没有默认值的类,提供存根默认对象或类似的东西。

此解决方案的缺点是您必须重新考虑将对象连接在一起的方式。这真的是一个好处。诸如prefs之类的依赖关系必须“从外部世界”提供给您的对象,例如来自Interface Builder或某种工厂类。 (正如我在开头所说,这是一个平衡问题。如果你只有一个首选项字符串,那么构建所有这些就可能不值得获得单个字符串。)

单身人士是魔鬼解决这个问题的方法 - 阅读MiškoHevery撰写的Singletons are Pathological Liars博客文章以及从那里链接的博文。

答案 2 :(得分:-1)

<强>更新 调用[NSUserDefaults standardUserDefaults]不会引入额外的开销,尽管它可能不是最简洁的。它可能不是最简洁的唯一时间是复杂对象包含在偏好中,例如字典或数组 - 在这种情况下,您可能希望在初始化时分配给本地变量。