gpt4 book ai didi

objective-c - 包装 NSUserDefaults 的模式是什么?

转载 作者:可可西里 更新时间:2023-11-01 04:42:15 29 4
gpt4 key购买 nike

我的应用程序使用 [NSUserDefaults standardUserDefaults] 作为一个快速而肮脏的数据库来存储关于用户和应用程序本身的状态。 NSUserDefaults 的问题在于它的灵 active 导致了很大的困惑,例如当不同的文件都以自己的方式设置和读取字典中的不同键时。您无法强制执行规则,您可以搞砸 key 名称等。

我为 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;

最佳答案

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

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

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

关于objective-c - 包装 NSUserDefaults 的模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14064405/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com