У меня есть приложение, которое загружает информацию из веб-службы и кэширует ее в памяти. В частности, мой класс синглтон-кэша содержит переменную экземпляра 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:
быть обернут аналогичным образом?) Если нет, то как мне обеспечить безопасность того, что я делаю?