Лучший способ кэшировать JSON из API в SWIFT?

Мне нужно кэшировать данные json из API в swift. Поэтому я исследовал "Лоту" и дошел до этого "Почта" .

Я попытался реализовать Option 1 в своем приложении. Но пользовательский менеджер всегда возвращал нуль. Я не знаю почему?

После этого я получил AwesomeCache. В нем говорится, что это Awesome API Caching. Но я не знаю, как это реализовать? Я назвал это Issue. Тем не менее я не могу понять это.

Вот как моя текущая реализация выглядит без кеша:

Alamofire.request(.GET, "http://api.androidhive.info/volley/person_array.json")

    .responseJSON { (_, _, data, _) in
        let json = JSON(data!)
        let catCount = json.count
        for index in 0...catCount-1 {
            let name = json[index]["name"].string
            println(name)
         }

Пожалуйста, предложите мне лучший способ кэширования JSON из API?

Спасибо в Advance!

UPDATE

Это мои требования

  • Извлеките JSON из API и проанализируйте данные JSON. Это можно сделать с помощью Alamofire и SwiftyJSON

  • Я заполню проанализированные данные в представлении таблицы. Он работает, когда пользователь находится в сети.

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

Поэтому мне нужно сохранить данные Parsed или данные JSON в моем кеше, и мне нужно обновить или истечь кеш в течение недели или дней.

Я не предпочитаю хранить JSON на своем диске, потому что он будет обновлен.

Пожалуйста, предложите мне лучший способ достичь этого...

Ответ 1

В вашем распоряжении уже много инструментов.

NSURLCache

Все ваши запросы уже сохранены в NSURLCache в NSURLSessionConfiguration на NSURLSession, хранящемся внутри sharedInstance Alamofire Manager. Эти сохраненные запросы уже соответствуют всем правилам политики кеширования, предоставляемым серверами, на которые вы нажимаете. Вы можете контролировать поведение кэширования, установив requestCachePolicy на свой собственный NSURLSessionConfiguration. Я также предлагаю вам прочитать эту потрясающую статью NSHipster, в которой вы можете прочитать все NSURLCache и как ее контролировать.

Создание пользовательских объектов Manager описано в текущем документе AlaMofire .

Загрузка JSON на диск

Вы также можете загрузить JSON прямо на диск с помощью Alamofire.download вместо Alamofire.request. Это загрузит полезную нагрузку в fileURL, который вы предоставите в закрытии destination. Это даст вам полный контроль над кешированием файла после этого момента. После этого вам понадобится создать свою собственную политику кэширования в этих файлах, если вы захотите следовать правилам кэширования заголовков, предоставленным сервером.

Отображение таблицы заполнения

Как только вы загрузите свои данные на диск, вам нужно загрузить его в блок NSData и проанализировать его в JSON, чтобы заполнить таблицу. Это должно быть довольно прямолинейно. Вам необходимо указать пункт назначения NSURL, который вы указали в Alamofire, когда вы начали загрузку. Затем загрузите данные файла в кадр NSData. Наконец, используйте NSJSONSerialization для преобразования объекта NSData в JSON AnyObject, который может быть проанализирован в объектах модели, чтобы заполнить представление таблицы.

Очевидно, что вы не "имеете" для анализа JSON в объектах модели, но это помогает защитить представление таблицы от искаженных данных JSON.

Сохранение JSON для автономного использования

Если вы придерживаетесь такого подхода, вам нужно будет отслеживать даты истечения срока действия кеша в виде CoreData или SQLite. Это можно сделать либо путем кэширования путей к файлам JSON на диске, либо для хранения объектов модели непосредственно в CoreData или SQLite. Это может стать довольно сложным, и я бы не рекомендовал этот подход, если вы абсолютно не хотите кэшировать свои объекты модели.

Автономное использование

Как правило, если вам нужно кэшировать данные для автономного использования, вы хотите сохранить объекты модели в чем-то вроде CoreData. Вы должны использовать метод Alamofire request в сочетании с сериализатором responseJSON для анализа данных в JSON. Затем вы конвертируете JSON в объекты модели. Оттуда вы сохраните объекты модели в CoreData, а затем, наконец, заполните свой вид таблицы объектами модели.

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

Учитывая обновления исходного вопроса, я бы рекомендовал этот подход.

Ответ 2

Вы можете использовать этот открытый источник кеша. Он кэширует данные на диске и в памяти. Может кэшировать много swift-типа и настраиваемый класс, которые наследуют NSObject и соответствуют протоколу NSCoding.

https://github.com/huynguyencong/DataCache

Для реализации: Во-первых, он использует NSCache для кэша mem. NSCache используется как словарь. Во-вторых, сохраните кеш на диске, используйте методы NSFileManager.