さまざまな要因(ネットワークの到達可能性、近接性など)が原因で完了できない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?