Отличный вопрос!
Вы можете добиться этого с помощью комбинации 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)
Это должно охватывать все инструменты, которые вам понадобятся для выполнения того, что вы пытаетесь сделать. То, как вы спроектируете точное решение, безусловно, зависит от вас, поскольку существует очень много возможных способов сделать это.
person
cnoon
schedule
10.02.2015