2015-01-05 5 views
8

Я установил свой кэш, как показано нижеAlamofire - NSURLCache не работает?

var cacheSizeMemory = 20 * 1024 * 1024 
var cacheSizeDisk = 100 * 1024 * 1024 
var sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "SOME_PATH") 
NSURLCache.setSharedURLCache(sharedCache) 

Создать запрос с политикой кэширования

var request = NSMutableURLRequest(URL: NSURL(string: "\(baseUrl!)\(path)")!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: timeout) 

сделать запрос и получить ответ со следующими Cache-Controlprivate, max-age=60

Затем попытайтесь проверить кэш

var cachedResponse = NSURLCache.sharedURLCache().cachedResponseForRequest(urlRequest) 

Значение nil

Любые мысли?

+0

Я имею ту же самую проблему прямо сейчас, никакого решения пока нет. – user1007895

ответ

9

Я закончил вручную, добавив Cache-Control как private в заголовок моего запроса, и теперь он работает. Даже не нужно вручную проверить кэш, Alamofire делает это для вас

let cachePolicy: NSURLRequestCachePolicy = isReachable() ? .ReloadIgnoringLocalCacheData : .ReturnCacheDataElseLoad 

var request = NSMutableURLRequest(URL: NSURL(string: "\(baseUrl!)\(path)")!, cachePolicy: cachePolicy, timeoutInterval: timeout) 

request.addValue("private", forHTTPHeaderField: "Cache-Control") 

var alamoRequest = Manager.sharedInstance.request(urlRequest) 
+0

Не могли бы вы предоставить нам фрагмент кода? – user1007895

+0

@ user1007895 обновленный ответ – aryaxt

+3

Это не работает для меня. – user1007895

17

Я был в состоянии вручную кэш страниц, записывая их в sharedURLCache, как это:

Alamofire.request(req) 
     .response {(request, res, data, error) in 
      let cachedURLResponse = NSCachedURLResponse(response: res!, data: (data as NSData), userInfo: nil, storagePolicy: .Allowed) 
      NSURLCache.sharedURLCache().storeCachedResponse(cachedURLResponse, forRequest: request) 
     } 

NSURLCache кажется соблюдайте заголовки, отправленные сервером, даже если вы настроите в своем коде все наоборот.

Википедия API, например, посылает

Cache-control: private, must-revalidate, max-age=0 

Что переводится: Должен перепроверить через 0 секунд.
Итак, NSURLCache говорит: «Хорошо, я ничего не буду кэшировать».

Но, сохраняя ответ на кеш, он работает. По крайней мере, на iOS 8.2.

Почти потерял мое мнение об этом. :)

+1

Хорошее решение. С этим, уверены ли мы, что NSURLCache всегда возвращает кешированный ответ, не считая заголовки? – toupper

+0

он не работает в iOS 10, любые слова по этому поводу? –

2

[Swift решение для разрешения истечения NSURLcache]

Я думаю, что главная проблема здесь заключается в следующем: ReturnCacheDataElseLoad.

@arayax дал вам ответ, который зафиксирует, что возможно, но мое решение было бы что-то вроде этого:

Поскольку я использую Alamofire для сетевых запросов я установил свою конфигурацию:

configuration.requestCachePolicy = .ReturnCacheDataElseLoad 

и когда я делаю запрос я проверить подключение к интернету, если это правда, то ясно NSURLCache, так что заставит Alamofire сделать запрос на сервер, а не из кэша:

if Reachability.isConnectedToNetwork() == true { 
     ConfigService.cache.removeAllCachedResponses() 
    } 

    ConfigService.manager?.request(.GET, ... 

Надеюсь, это поможет, может быть, для других проблем с NSURLCache :)

1

Для меня это было Pragma → no-cache после удаления все это сработало.

0

Это, как я получил кэш работать с Alamofire 4 и быстрой 3 (Semi полной функции для справки):

func getTheList(courseId : String)-> Void{ 
     appConstants.sharedInstance.startLoading() 
     let TheURL = DEFAULT_APP_URL + "api/getMyList?Id="+ID 
     let urlString = NSURL(string: TheURL) 
     var mutableURLRequest = URLRequest(url: urlString! as URL) 
     mutableURLRequest.httpMethod = "GET" 
     mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
     mutableURLRequest.cachePolicy = NSURLRequest.CachePolicy.returnCacheDataElseLoad 


     Alamofire.request(mutableURLRequest) 
      .responseJSON 
      {....... 
Смежные вопросы