包装NSUserDefaults的模式是什么?

Ale*_*lin 5 cocoa-touch design-patterns objective-c nsuserdefaults ios

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

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

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

.H:

@interface UserDefaultsManager: NSObject

+ (UserDefaultsManager *)sharedInstance;

@property (nonatomic, assign) NSInteger somethingImTracking;

@end
Run Code Online (Sandbox Code Playgroud)

和.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];
}
Run Code Online (Sandbox Code Playgroud)

并访问:

NSInteger foo = [UserDefaultsManager sharedInstance].somethingImTracking;
Run Code Online (Sandbox Code Playgroud)

jrt*_*ton 4

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

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

synchronize不必每次设置时都包含在内。仅当快速连续地从不同线程访问默认值时才需要它。操作系统也会定期调用它自己。