按惯例,这里肯定是先上 Demo
某些特定场景中,在短时间内对同一个连接进行多次请求,是一种浪费资源的行为,比如说连续点击下载同一张图片,这时我们就需要把重复的请求取消掉。一般情况下,我们都是使用 URLSession 来进行网络请求,所以我们可以对 URLSessionDataTask 实例执行 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()
}
在发起请求的时候,把 dataTask 缓存起来,请求完成时再把缓存清空,如果在新的网络请求中,发现缓存中已经存在该 task,就可以把该 task 取消掉(也可以取消新的 task,保留旧的,看实际需求),并执行新的 task,这样可以减少不必要的资源浪费。
网络请求的取消,这其实只是一个很简单的功能,但是经常会在面试中间接问到,比如网络层处理等。虽然一般不会直接问到,但是如果你不了解它,还是会给面试官吓唬到的。
网友评论