6

私のアプリは、[NSUserDefaults standardUserDefaults] を、ユーザーとアプリ自体に関する状態を格納するための迅速で汚れたデータベースとして使用しています。NSUserDefaults の問題点は、その柔軟性によって、たとえば、さまざまなファイルが辞書内のさまざまなキーを独自の方法で設定および読み取る場合など、大きな混乱が生じることです。ルールを強制することはできません。キー名などを台無しにすることができます..

NSUserDefaults 用の単純なシングルトン「マネージャー スタイル」ラッパーを作成しました。これは、使用時にデフォルト値の設定を処理し、値のフェッチに使用されるキーの名前を非表示にし、保存時に NSData へのエンコードなどの追加ロジックをカプセル化します。ストアからオブジェクトを取得します。

現時点では、それらは read/set アクセサーによってサポートされているプロパティですが、何かが間違っているので、同じ結果を達成するためのよりエレガントな方法があるのではないかと考えています。かなりの定型文があり、構文はやや不快になります。例を挙げると:

.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;
4

1 に答える 1

4

個人的には、文字列定数を使用してキー名を保存し、ユーザー デフォルト オブジェクトに直接アクセスするだけですが、デフォルトを大量に使用したり、さまざまなクラスで使用したりすることはあまりありません。

あなたのコードに加えたい改善点の 1 つは、代わりにそれらをすべてクラス メソッドとして使用することです。シングルトンには何のメリットもありません (状態を維持していないため、すべて defaults オブジェクトにあります)。これ...sharedInstanceにより、使用パターンから醜い反復コード ( ) が少し取り除かれます。

synchronize設定するたびに含める必要はありません。異なるスレッドからデフォルト値にすばやく連続してアクセスする場合にのみ必要です。OS はそれ自体も定期的に呼び出します。

于 2012-12-28T07:49:20.697 に答える