Кеширование MKNetworkKit не работает

Столкнулся с действительно необычной проблемой кеширования MKNetworkKit. Проще говоря, проблема в том, что "Это не работает"..!

Я создал простой тестовый проект, в котором есть проблема. Проект ничего не делает, а просто делает простой запрос GET к http://where.yahooapis.com//, чтобы получить адрес или информацию для названия города. Предполагается, что ответ будет цепляться при первом его запуске, и со второго раза обработчик завершения будет вызываться дважды, один раз с кэшированным ответом и снова с извлеченным ответом. как вы можете видеть ниже, который взят из http://blog.mugunthkumar.com/coding/ios-tutorial-image-cache-and-loading-thumbnails-using-mknetworkkit/

MKNetworkKit вызывает тот же обработчик завершения с кэшированными данными, если вы делаете вызов во второй раз. Когда сетевое подключение установлено правильно, MKNetworkKit дважды вызывает ваш обработчик завершения. Сначала с кэшированными данными, а затем снова после получения последних данных с сервера.

Ну, необычно то, что я запускаю приложение, оно не кешируется, я снова запускаю приложение, оно снова не кешируется, после нескольких случайных запусков внезапно начинает работать кеширование. Я удалил приложение и запустил его снова, кэш не будет работать, пока не произойдет несколько случайных запусков и проблема не повторяется..

К вашему сведению, я использовал последнюю версию MKNetworkkit, загруженную из GIT.

Я не уверен, что это какая-то проблема с моим кодом или ошибка с самим MKNetworkKit. Поэтому, пожалуйста, ознакомьтесь с кодом и дайте мне знать, если это я или MKNetworkKit, который вызывает эту проблему.

Вот ссылка для загрузки примера проекта [https://www.box.com/s/tsfw3z0avpti051xbyhv] 4

Заранее спасибо.

1 ответ

Решение

Наконец, я могу понять это! Итак, вот что происходит во время кеширования,

Кэширование MKNetworkKit является очень легким и кэширует ваши ответы в NSMutableDictionary. Разве это не приводит к высокому использованию памяти? Да. конечно, но MKNetworkKit умный. Это наблюдает UIApplicationDidReceiveMemoryWarningNotification и сбрасывает словарь на диск. В следующий раз, когда вы делаете запрос к кэшированному URL, кэшированные данные возвращаются в память. Таким образом, он имеет кэш-память в памяти и кэш-память на диске и использует наименее недавно используемый алгоритм для сброса элементов на диск. Класс MKNetworkEngine имеет методы, которые могут быть переопределены для управления стоимостью кэша.

Так вот, когда я запускал приложение в первый раз, ответ кэшировался в "памяти", а не на "диске". Когда я запускал приложение в холодном режиме, ранее кэшированный ответ никогда не передавался на "диск" из "памяти". (Именно поэтому в каталоге кэша приложения не было даже кэшированного файла...!) Следовательно, successBlock никогда не вызывался дважды, с кэшированным ответом, потому что его не было...!

Чтобы преодолеть эту проблему, нужно просто переопределить одну функцию всего одной строкой кода...!

- (int) cacheMemoryCost
{
    return 0;
}
Другие вопросы по тегам