Потоковая безопасность доступа и уничтожения NSMutableDictionary - PullRequest
1 голос
/ 24 января 2012

У меня есть приложение, которое загружает информацию из веб-службы и кэширует ее в памяти. В частности, мой класс синглтон-кэша содержит переменную экземпляра NSMutableDictionary *memoryDirectory, которая содержит все кэшированные данные. Данные в этом кэше могут быть легко перезагружены, поэтому, когда я получаю UIApplicationDidReceiveMemoryWarningNotification, я вызываю метод для простого вызова

- (void) dumpCache:(NSNotification *)notification
{
    memoryDirectory = nil;
}

Я немного беспокоюсь о безопасности потоков здесь. (Признаюсь, я не очень разбираюсь в потоках в целом, тем более в реализации Cocoa.) Кэш - это изменяемый словарь, значения которого являются изменяемыми словарями, поэтому существует два уровня ключей для доступа к данным. Когда я пишу в кеш, я делаю что-то вроде этого:

- (void) addDataToCache:(NSData *)data
                 forKey:(NSString *)
                 subkey:(NSString *)subkey
{
    if (!memoryDirectory)
        memoryDirectory = [[NSMutableDictionary alloc] init];

    NSMutableDictionary *methodDictionary = [memoryDirectory objectForKey:key];
    if (!methodDictionary) {
        [memoryDirectory setObject:[NSMutableDictionary dictionary] forKey:key];
        methodDictionary = [memoryDirectory objectForKey:key];
    }

    [methodDictionary setObject:data forKey:subkey];
}

Я беспокоюсь, что когда-нибудь в середине процесса, dumpCache: собирается обнулить словарь, и мне останется делать кучу setObject:forKey:, которые ничего не делают. Это не смертельно, но вы можете представить себе проблемы, которые могут возникнуть, если это произойдет, пока я читаю кеш.

Достаточно ли обернуть все мои чтения и записи в кэш в какой-то блок @synchronized? Если так, то как это должно выглядеть? (И должен ли мой dumpCache: быть обернут аналогичным образом?) Если нет, то как мне обеспечить безопасность того, что я делаю?

1 Ответ

2 голосов
/ 24 января 2012

Вместо использования NSMutableDictionary рассмотрите возможность использования NSCache, который является поточно-ориентированным. См. этот ответ для примера использования. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...