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)
就我个人而言,我使用字符串常量来存储键名称,并直接访问用户默认值对象,但我不倾向于在很大程度上或在许多不同的类中使用默认值。
我对您的代码所做的一项改进是将它们全部作为类方法。单例没有任何好处(您不维护任何状态,这一切都在默认对象中),并且这会...sharedInstance从您的使用模式中删除一些丑陋的重复代码()。
synchronize不必每次设置时都包含在内。仅当快速连续地从不同线程访问默认值时才需要它。操作系统也会定期调用它自己。
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |