Синхронизированный NSKeyedArchiver или NSUserDefaults - PullRequest
1 голос
/ 25 мая 2011

У меня есть одноэлементный класс менеджера отложенных транзакций, который отвечает за постановку в очередь и снятие очереди транзакций iphone-app-server, которые не могут быть выполнены из-за множества факторов (доступность сети, близость и т. Д.). Когда достижимость / близость восстанавливается, он пытается исключить транзакции. Также возможно, что другая транзакция будет поставлена ​​в очередь в то же время, когда происходит снятие очереди.
Насколько я понимаю, NSUserDefaults - это потокобезопасная оболочка изменяемого словаря SO link , и это именно то, что мне нужно. В той же ссылке SO указано, что 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?

1 Ответ

1 голос
/ 25 мая 2011

Это правда, что NSUserDefaults является потокобезопасным (это говорит об этом в документах ).Но концептуально, это действительно не то место, чтобы делать вещи, как вы делаете.Это будет работать, но вы в конечном итоге получите свои идентификаторы транзакций, потенциально загрязняющие пространство имен предпочтений, которое, возможно, вы захотите использовать позже с пакетом предпочтений и т. Д.

Должна работать блокировка чтения / записи.,Мне кажется странным, что наложение блокировок вокруг файловых операций;Вы также можете хранить объект очереди в памяти (с блокировкой) и периодически очищать его, например, от основного потока.Или используйте файл блокировки на диске для защиты записи / чтения.

...