1

さまざまな要因(ネットワークの到達可能性、近接性など)が原因で完了できないiphoneからアプリサーバーへのトランザクションのエンキューとデキューを担当するシングルトン遅延トランザクションマネージャークラスがあります。到達可能性/近接性が復元されると、トランザクションのデキューが試行されます。デキューが行われているのと同時に、別のトランザクションがエンキューされる可能性もあります。
私の理解では、NSUserDefaultsは、変更可能なディクショナリSOリンクのスレッドセーフラッパーであり、まさに私が望んでいるものです。その同じSOリンクは、NSUserDefaultsがユーザー設定用であると考えています。

これらのトランザクションはユーザー設定ではありませんが、それが私が望む機能です。だから、ここに質問があります、辞書を壊すことなくNSUserDefaultsのトランザクションのNSMutableDictionaryを読み取り/書き込み/同期できますか、またはNSKeyed(Un)Archiver(以下を参照)で読み取りと書き込みを行う独自のロックメカニズムを実装する必要がありますか?

いくつかのコード:

 - (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?
4

1 に答える 1

1

NSUserDefaultsスレッドセーフであることは事実です(ドキュメントでそう述べています)。しかし、概念的には、実際にはあなたがしているようなことをする場所ではありません。それは機能しますが、トランザクションIDが、後でプリファレンスバンドルなどで使用したいプリファレンス名前空間を汚染する可能性があります。

読み取り/書き込みの周りでロックを実行すると機能するはずです。ファイル操作の周りにロックをかけることは私には奇妙に感じます。キューオブジェクトを(ロックして)メモリに保持し、メインスレッドなどから定期的にのみフラッシュすることもできます。または、ディスク上のロックファイルを使用して、書き込み/読み取りを保護します。

于 2011-05-25T13:18:15.900 に答える