包装NSUserDefaults的模式是什么?

时间:2012-12-28 04:02:05

标签: objective-c ios cocoa-touch design-patterns nsuserdefaults

我的应用程序使用[NSUserDefaults standardUserDefaults]作为快速而脏的数据库来存储有关用户和应用程序本身的状态。 NSUserDefaults的问题在于它的灵活性允许线下很乱,例如当不同的文件都以自己的方式设置和读取字典中的不同键时。你没有强制执行规则,你可以搞砸关键名称等。

我为NSUserDefaults编写了一个简单的单独“管理器式”包装器,它在使用时都负责设置默认值,隐藏用于获取值的键的名称并封装一些额外的逻辑,例如编码到NSData,在存储和检索商店中的对象时。

此时它们的属性由读取/设置访问器支持,但有些东西让我误解了,我想知道是否有更优雅的方法来实现相同的结果。有相当多的样板,语法最终有点不愉快。举个例子:

·H:

@interface UserDefaultsManager: NSObject

+ (UserDefaultsManager *)sharedInstance;

@property (nonatomic, assign) NSInteger somethingImTracking;

@end

和.m:

NSString * const kSomethingImTracking= @"SomethingImTracking";

@implementation UserDefaultsManager

[...]

- (NSInteger)somethingImTracking
{
    return [[[NSUserDefaults standardUserDefaults] objectForKey:kSomethingImTracking] intValue];
}

- (void)setSomethingImTracking:(NSInteger)somethingImTracking
{
    [[NSUserDefaults standardUserDefaults] setInteger:somethingImTracking forKey:kSomethingImTracking];
}

并访问:

NSInteger foo = [UserDefaultsManager sharedInstance].somethingImTracking;

1 个答案:

答案 0 :(得分:4)

我个人使用字符串常量来存储键名,只是直接访问用户默认对象,但我不倾向于在很大程度上使用默认值,或者在许多不同的类中使用默认值。

我对您的代码所做的一项改进是将它们全部作为类方法。单例没有任何好处(你没有维护任何状态,这都是在defaults对象中)并且这会从你的使用模式中获得一些丑陋的重复代码(...sharedInstance)。

每次设置时都不需要

synchronize。只有在快速连续访问不同线程的默认值时才需要它。操作系统也会定期调用它。