Ответ 1
Отличный вопрос!
Вы можете абсолютно выполнить это с помощью комбинации Alamofire и SwiftyJSON. Я бы порекомендовал это сочетание нескольких вещей, чтобы сделать это как можно проще.
Я думаю, у вас есть два подхода к извлечению JSON.
- Получить данные JSON в памяти и использовать политику кэширования
- Загрузите данные JSON на диск непосредственно в локальный кеш
Вариант 1
// Create a shared URL cache
let memoryCapacity = 500 * 1024 * 1024; // 500 MB
let diskCapacity = 500 * 1024 * 1024; // 500 MB
let cache = NSURLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "shared_cache")
// Create a custom configuration
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders
configuration.HTTPAdditionalHeaders = defaultHeaders
configuration.requestCachePolicy = .UseProtocolCachePolicy // this is the default
configuration.URLCache = cache
// Create your own manager instance that uses your custom configuration
let manager = Alamofire.Manager(configuration: configuration)
// Make your request with your custom manager that is caching your requests by default
manager.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"], encoding: .URL)
.response { (request, response, data, error) in
println(request)
println(response)
println(error)
// Now parse the data using SwiftyJSON
// This will come from your custom cache if it is not expired,
// and from the network if it is expired
}
Вариант 2
let URL = NSURL(string: "/whereever/your/local/cache/lives")!
let downloadRequest = Alamofire.download(.GET, "http://httpbin.org/get") { (_, _) -> NSURL in
return URL
}
downloadRequest.response { request, response, _, error in
// Read data into memory from local cache file now in URL
}
Вариант 1, безусловно, использует наибольшее количество поддерживаемых Apple кеширования. Я думаю, что с помощью того, что вы пытаетесь сделать, вы сможете использовать NSURLSessionConfiguration
и конкретную политику кэша , чтобы выполнить то, что вы хотите сделать.
Вариант 2 потребует гораздо большего объема работы и будет немного странной системой, если вы используете политику кэширования, которая фактически кэширует данные на диске. Загрузки закончили копирование уже кэшированных данных. Здесь будет поток, как если бы ваш запрос существовал в вашем пользовательском кэше URL.
- Сделать запрос на скачивание
- Запрос кэшируется, поэтому кэшированные данные загружаются в NSInputStream
- Данные записываются в предоставленный
URL
через NSOutputStream - Серийный запрос ответа вызывается там, где вы загружаете данные в память
- Затем данные анализируются с использованием SwiftyJSON в объектах модели.
Это довольно расточительно, если вы не загружаете очень большие файлы. При загрузке всех данных запроса в память вы можете столкнуться с проблемами памяти.
Копирование кэшированных данных в предоставленный
URL
, скорее всего, будет реализовано через NSInputStream и NSOutputStream. Все это обрабатывается Apple со стороны Foundation. Это должно быть очень эффективным для хранения данных. Недостатком является то, что вам нужно скопировать весь набор данных, прежде чем вы сможете получить к нему доступ.
NSURLCache
Еще одна вещь, которая может быть очень полезной для вас, - это возможность получить кешированный ответ прямо из вашего NSURLCache
. Взгляните на метод cachedReponseForRequest:
, который можно найти здесь.
SwiftyJSON
Последний шаг - синтаксический анализ данных JSON в объектах модели. SwiftyJSON делает это очень легко. Если вы используете Вариант 1 сверху, то вы можете использовать настраиваемый сериализатор ответов в Alamofire-SwiftyJSON. Это выглядит примерно так:
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
.responseSwiftyJSON { (request, response, json, error) in
println(json)
println(error)
}
Теперь, если вы использовали Вариант 2, вам нужно будет загрузить данные с диска, а затем инициализировать объект SwiftyJSON и начать синтаксический анализ, который будет выглядеть примерно так:
let data = NSData(contentsOfFile: URL.path)!
let json = JSON(data: data)
Это должно охватывать все инструменты, в которых вам необходимо выполнить то, что вы пытаетесь сделать. Как вы строите точное решение, безусловно, зависит от вас, поскольку существует так много возможных способов сделать это.