2011-05-25 5 views
1

私は、さまざまな要因(ネットワークの到達可能性、近接性など)によって完了できないiphone-to-app-serverトランザクションのエンキューおよびデキューを担当するシングルトン遅延トランザクションマネージャクラスを持っています。到達可能性/近接性が復元されると、トランザクションをデキューしようとします。デキューするのと同時に他のトランザクションをエンキューすることも可能です。
私の理解は、NSUserDefaultsは、正確に私が欲しいものである変更可能な辞書SO linkのスレッドセーフラッパーです。同じSOのリンクは、NSUserDefaultsがユーザーの好みのためのものであることを示しています。NSKeyedArchiverまたはNSUserDefaultsを同期しました

これらの取引はユーザー設定ではありませんが、それは私が必要とする機能です。 ここで、NSMutableDictionaryのトランザクションをNSMutableDictionaryの読み込み/書き込み/同期化することはできますか?またはNSKeyed(Un)アーカイバ(下記参照)で読み書きする独自のロック機構を実装する必要がありますか?

いくつかのコード:

- (void) queThing:(Thing *)aThing { 

    // @synchronized this block? 
    NSMutableDictionary * QD = [self readFile]; 
    [QD setObject:aThing forKey:aThing.thingId]; 
    [self writeFile: QD]; 
    // @ sync? 
} 
- (void) writeFile:(NSMutableDictionary *)theData { 
    BOOL status = [NSKeyedArchiver archiveRootObject: theData toFile:archivePath]; 
    if (!status) { 
     DebugLog(@"Write to archive failed."); 
    } else { 
     DebugLog(@"Write to archive SUCCEEDED."); 
    } 
} 
- (NSMutableDictionary *) readFile { 
    NSMutableDictionary *Q =[NSKeyedUnarchiver unarchiveObjectWithFile:archivePath]; 
    if (! Q) { 
     Q = [NSMutableDictionary dictionaryWithCapacity:2]; 
    } 
    return Q; 
} 

デキュー:

// @synchronized this block? 
    NSMutableDictionary * QD = [self readFile]; 
    [QD removeObjectForKey:thing.thingId]; 
    [self writeFile: QD]; 
    // @ sync? 

答えて

1

それはNSUserDefaultsスレッド(それsays so in the docs)安全であることは事実です。しかし、概念的には、あなたがやっているようなものをやるべき場所ではありません。それはうまくいくでしょうが、後で好みのバンドルなどで使うことを望むかもしれない設定名前空間を汚染する可能性のあるあなたのトランザクションIDで終わるでしょう。

読み取り/書き込みの周りをロックすることはうまくいくはずです。ファイル操作の周りにロックを置くことは、私にとっては奇妙な感じです。キューオブジェクトを(ロックして)メモリ内に保持し、定期的に例えばキューから解放することもできます。メインスレッドまたは、ディスク上のロックファイルを使用して、書き込み/読み取りを保護します。

+0

ありがとうございました。私は読み書きロックを使うつもりだと思う。 – Rayfleck

関連する問題