Предыстория появления класса MemCache тривиальна.
В разработке находится проект, который большую часть времени тратит на загрузку небольших объемов данных из сети.
В основном данные JSON и небольшие изображения.
Каждый контроллер объявил NSMutableDictionary, в котором хранились результаты запроса.
Но с увеличением количества контроллеров возникли две проблемы — дублирование кода и потеря результатов кэша при вызове popViewController. Ниже представлено решение этих проблем.
Было решено провести рефакторинг проекта, в результате чего появился одноэлементный класс MemCache и две категории, по одной для NSString и NSObject.
Класс MemCache должен был осуществлять кеширование на короткое время (двух минут в этом проекте хватало), самостоятельно очищать память при возникновении MemoryWarning, а также при переходе приложения в фон.
Ссылка на исходный код находится в конце статьи, а пока расскажу об основных этапах реализации.
В методе init подписываемся на уведомления о предупреждениях памяти и потере активности.
- (id) init
{
self = [super init];
if (self != nil)
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(clearCache)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
[center addObserver:self
selector:@selector(clearCache)
name:UIApplicationWillResignActiveNotification
object:nil];
_lifeTime = 60.0f;
}
return self;
}
Не забудьте отписаться от уведомлений в Dealloc. - (void)dealloc
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center removeObserver:self
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
[center removeObserver:self
name:UIApplicationWillResignActiveNotification
object:nil];
}
Поскольку кэш может быть очищен в любой момент по запросу или при наступлении описанных выше событий, то при записи нового элемента необходимо проверять, есть ли на самом деле куда записать.
Для каждого элемента при добавлении мы запускаем отложенный вызов метода удаления его из кэша.
- (void)setValue:(id)value forKey:(NSString *)key
Для удобства использования я использовал категории.
{
if (!_cache)
{
_cache = [[NSMutableDictionary alloc] init];
}
[_cache setValue:value forKey:key];
[NSObject cancelPreviousPerformRequestsWithTarget:_cache selector:@selector(removeObjectForKey:) object:key];
[_cache performSelector:@selector(removeObjectForKey:) withObject:key afterDelay:_lifeTime];
}
Теперь, чтобы поместить объект в кеш, просто напишите что-то вроде: [jsonValue setMemCacheValueForKey:[[[connection originalRequest] URL] absoluteString]];
И вы можете получить объект следующим образом: id val = [[url absoluteString] memCacheValue];
Ссылка на репозиторий - github.com/eltiren/MemCahce-IOS
P.S. Скомпилировано с включенным ARC.
Теги: #разработка для iOS #memcache #разработка для iOS
-
Спутниковое Наблюдение В Гражданской Авиации
19 Dec, 24 -
Подготовка Ssl-Сертификатов К Установке
19 Dec, 24 -
Универсальные Платформы – Это Зло
19 Dec, 24