iOS 开发 - 取消网络请求

按惯例,这里肯定是先上 Demo

某些特定场景中,在短时间内对同一个连接进行多次请求,是一种浪费资源的行为,比如说连续点击下载同一张图片,这时我们就需要把重复的请求取消掉。一般情况下,我们都是使用 URLSession 来进行网络请求,所以我们可以对 URLSessionDataTask 实例执行 cancel 方法来取消该请求:

let url = "http://xxxx.xxxx"
var cacheTask: Dictionary = [:]
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,这样可以减少不必要的资源浪费。

网络请求的取消,这其实只是一个很简单的功能,但是经常会在面试中间接问到,比如网络层处理等。虽然一般不会直接问到,但是如果你不了解它,还是会给面试官吓唬到的。

你可能感兴趣的:(iOS 开发 - 取消网络请求)