2011-05-25 3 views
1

У меня есть одноуровневый менеджер транзакций с задержкой транзакций, который отвечает за переопределение и удаление транзакций 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? 

ответ

1

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

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

+0

спасибо. Думаю, я пойду с помощью блокировки чтения/записи. – Rayfleck