Мемкэш Для Ios

Предыстория появления класса 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

Вместе с данным постом часто просматривают: