15

Tại sao bộ nhớ cache phản hồi. Nó trả về các câu trả lời được tìm nạp trước đó. Nó thậm chí hoạt động nếu tắt kết nối mạng. Đặt lại trình mô phỏng iOS dường như không hoạt động. Thực hiện một yêu cầu, sau đó một lần nữa với internet offline không hoạt động (lưu trữ).Ngăn NSURLSession phản hồi bộ nhớ đệm

public let urlSession: NSURLSession 

public init() 
{ 
    // ... 

    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData 
    urlSession = NSURLSession(configuration: configuration) 
} 

func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback) 
{ 
    let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path 
    let url = NSURL(string: urlString) 
    let request = oauthInstance.request(forURL: url!) 

    request.HTTPMethod = httpMethod 
    self.customOAuth2Manager.setupRequest(request) 

    for (key, value) in headers { 
     request.setValue(value, forHTTPHeaderField:key) 
    } 

    if let body = body where body != "" { 
     let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
     request.HTTPBody = postData 
    } 

    let task = urlSession.dataTaskWithRequest(request) { data, response, error in 
     self.parseData(data, response:response, error:error, body:body, callback: callback) 
    } 
    task.resume() 
} 

Cập nhật

tôi quản lý để giải quyết nó bằng cách gọi mã này từ didFinishLaunching trong AppDelegate:

func removeUrlCache() 
{ 
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)) 
} 

Tuy nhiên, tôi vẫn tò mò tại sao mã ban đầu của tôi không hoạt động . Nó cũng cảm thấy một chút xấu xí để vô hiệu hóa bộ nhớ cache cho tất cả các ứng dụng để giải quyết vấn đề của tôi.

+0

Cảm ơn !! Bạn có khám phá thêm về điều này không? –

+2

thêm 'configuration.URLCache' vào' nil' khi bạn tạo đối tượng 'NSURLSessionConfiguration' và phản hồi sẽ không được lưu trong bộ nhớ cache. – execv

Trả lời

13

Cảm ơn câu hỏi. Nó đặt tôi vào con đường bên phải.

Có nhiều khả năng hơn với NSURLCache.sharedURLCache() và bạn không cần thay đổi dung lượng bộ nhớ và dung lượng đĩa cho việc này.

Bạn có thể xóa tất cả câu trả lời được lưu trong bộ nhớ cache. Làm việc cho tôi.

NSURLCache.sharedURLCache().removeAllCachedResponses() 

Hoặc bạn có thể xóa bộ nhớ cache cho một phản ứng duy nhất. Không làm việc cho tôi iOS 9.

let request = NSURLRequest(URL: NSURL(string:url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData , timeoutInterval: 10) 
NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) 

//Do your request here 

Tôi hy vọng nó sẽ giúp người ra!

Edit: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) không được làm việc cho tôi không may

thay thế của tôi là: Tôi đang sử dụng này cho kéo để làm mới và tôi đang theo dõi ngày cập nhật cuối cùng. Vì vậy, tôi đã sử dụng mã sau:

NSURLCache.sharedURLCache().removeCachedResponsesSinceDate(lastUpdate) 

Nhưng vì một số lý do này không hoạt động ête.

Kể từ iOS 8, bộ nhớ cache đơn loại bỏ phương pháp dường như bị phá vỡ: https://stackoverflow.com/a/26343653/2826164

+0

Tôi đã sử dụng giải pháp thay thế để xóa phản hồi được lưu trong bộ nhớ cache cho một yêu cầu cụ thể, đặt lại phản hồi được lưu trong bộ nhớ cache, xem câu trả lời của tôi trong bài đăng này http://stackoverflow.com/a/36507745/1080583 –

+0

Bạn có biết liệu nó hoạt động cho trình mô phỏng khác với cho thiết bị thực tế? Tôi đã sử dụng cách tiếp cận này và trên trình mô phỏng thậm chí xóa tất cả bộ nhớ cache trên cuộc gọi đến 'applicationWillResignActive' vẫn để lại tệp Cache.db đầy đủ. –

+0

Tôi đã thử nghiệm điều này chỉ trên thiết bị. Bạn có thể thử làm sạch bộ nhớ cache xCode có thể điều này sẽ cho kết quả khác nhau trong trình giả lập de (để xóa bộ nhớ cache xCode cmd + alt + shift + K) –

8

Không chắc chắn nếu điều này thực sự ngăn cản từ chaching hoặc chỉ buộc một tải lại tươi mỗi lần, nhưng đây là những gì làm việc cho tôi:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

Dưới đây là một bức ảnh chụp tùy chọn khác trong trường hợp ai đó có thể cần đến chúng:

enter image description here

Các vấn đề liên quan