Итак, я, наконец, создал свой собственный NSURLCache, полностью изменив его поведение, в более «ручной» режим: теперь запросы не кэшируются по умолчанию, но я могу вручную добавлять/получать ответы с помощью настраиваемого ключа. Вот код:
import Foundation
extension NSURLCache {
public func put(cachedResponse:NSCachedURLResponse, forKey key:String) {}
public func get(key:String) -> NSCachedURLResponse? { return nil; }
}
public class CustomNsUrlCache: NSURLCache {
// Prevent default caching:
public override func cachedResponseForRequest(request: NSURLRequest) -> NSCachedURLResponse? { return nil; }
public override func storeCachedResponse(cachedResponse: NSCachedURLResponse, forRequest request: NSURLRequest) {}
private func requestForKey(key:String) -> NSURLRequest {
let url:NSURL? = NSURL(string:"http://" + key);
return NSURLRequest(URL:url!);
}
public override func put(cachedResponse:NSCachedURLResponse, forKey key:String) {
super.storeCachedResponse(cachedResponse, forRequest:requestForKey(key));
}
public override func get(key:String) -> NSCachedURLResponse? {
return super.cachedResponseForRequest(requestForKey(key));
}
}
Не забудьте зарегистрировать пользовательский код делегата приложения:
let cache = CustomNsUrlCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 100 * 1024 * 1024, diskPath: nil);
NSURLCache.setSharedURLCache(cache);
Использование:
if let cachedResponse = NSURLCache.sharedURLCache().get(cacheKey) {
// Use cached response
}
else {
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if let data = data, response = response {
// Cache the response:
NSURLCache.sharedURLCache().put(NSCachedURLResponse(response:response, data:data), forKey:cacheKey);
// Use the fresh response
}
else {
print(error);
}
};
task.resume();
}
Другой подход заключается в использовании 'NSCache' для кэширования ваших ответов и перед началом запроса, посмотрите, есть ли у вас то, что вам нужно в вашем 'NSCache'. Вы можете использовать любой необходимый вам ключ. – Rob