iOS 开发 - 取消网络请求

作者: YxxxHao | 来源:发表于2017-09-27 23:02 被阅读335次

    按惯例,这里肯定是先上 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,这样可以减少不必要的资源浪费。

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

    相关文章

      网友评论

      • 随行的羊:希望关注 “iOS开发知识小集” 的专题哈,谢谢:smile:

      本文标题:iOS 开发 - 取消网络请求

      本文链接:https://www.haomeiwen.com/subject/etmpextx.html