按慣例鸳惯,這里肯定是先上 Demo
某些特定場景中节值,在短時間內(nèi)對同一個連接進行多次請求涧偷,是一種浪費資源的行為豪直,比如說連續(xù)點擊下載同一張圖片吗伤,這時我們就需要把重復(fù)的請求取消掉。一般情況下的畴,我們都是使用 URLSession 來進行網(wǎng)絡(luò)請求渊抄,所以我們可以對 URLSessionDataTask 實例執(zhí)行 cancel 方法來取消該請求:
let url = "http://xxxx.xxxx"
var cacheTask: Dictionary<String, URLSessionDataTask> = [:]
private lazy var request: NSMutableURLRequest = {
let request = NSMutableURLRequest()
request.timeoutInterval = 30
request.httpMethod = "GET"
return request
}()
private func requestData() {
let url = URL(string: self.url)
request.url = url
request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
let session = URLSession.shared
var dataTask: URLSessionDataTask!
dataTask = session.dataTask(with: request as URLRequest) { [unowned self] (data, response, error) -> Void in
if error != nil {
print(error?.localizedDescription ?? "not exist error info")
} else {
print("request success")
}
self.cacheTask.removeValue(forKey: self.url)
}
if cacheTask.keys.contains(where: { (id) -> Bool in
id == self.url
}) {
let task = cacheTask[self.url]
task?.cancel()
print("-------- cancel task ---------")
}
cacheTask[self.url] = dataTask
dataTask.resume()
}
在發(fā)起請求的時候,把 dataTask 緩存起來丧裁,請求完成時再把緩存清空护桦,如果在新的網(wǎng)絡(luò)請求中,發(fā)現(xiàn)緩存中已經(jīng)存在該 task煎娇,就可以把該 task 取消掉(也可以取消新的 task二庵,保留舊的贪染,看實際需求),并執(zhí)行新的 task催享,這樣可以減少不必要的資源浪費杭隙。
網(wǎng)絡(luò)請求的取消,這其實只是一個很簡單的功能因妙,但是經(jīng)常會在面試中間接問到痰憎,比如網(wǎng)絡(luò)層處理等。雖然一般不會直接問到攀涵,但是如果你不了解它铣耘,還是會給面試官嚇唬到的。