У меня есть одноуровневый менеджер транзакций с задержкой транзакций, который отвечает за переопределение и удаление транзакций iphone-to-app-server, которые невозможно завершить из-за множества факторов (доступность сети, близость и т. Д.). Когда доступность/близость восстанавливается, он пытается удалить транзакции. Также возможно, что другая транзакция будет выставлена в одно и то же время, когда происходит детекция.
Я понимаю, что NSUserDefaults - это потокобезопасная оболочка изменчивого словаря SO link, который именно то, что я хочу. Эта же ссылка SO указывает, что NSUserDefaults предназначен для пользовательских настроек.Синхронизированный NSKeyedArchiver или NSUserDefaults
Эти транзакции не являются пользовательскими настройками, но это функциональность, которую я хочу. Итак, вот вопрос, могу ли я прочитать/написать/синхронизировать NSMutableDictionary транзакций в NSUserDefaults без искажения словаря, или мне нужно реализовать собственный механизм блокировки при чтении и записи с помощью 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;
}
Dequeue:
// @synchronized this block?
NSMutableDictionary * QD = [self readFile];
[QD removeObjectForKey:thing.thingId];
[self writeFile: QD];
// @ sync?
спасибо. Думаю, я пойду с помощью блокировки чтения/записи. – Rayfleck