Кеширование 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;
}