如何在Swift中取消正在进行的HTTP请求?

Joo*_*. P 12 cocoa-touch ios nsurlsession swift

我的代码执行GET请求,如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
    // ...

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
        if error != nil {
            println("error = \(error)")
            return
        }

        if let HTTPresponse = response as? NSHTTPURLResponse {
            if HTTPresponse.statusCode == 200 { // Successfully got response
                var err: NSError?
                if let json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: &err) as? [String : AnyObject] {
                    // Success decoding JSON
                } else {
                    // Failed -> stop activity indicator
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.activityIndicator.stopAnimating()
                    })
                }
            }
            task.resume()
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

如果viewWillDisappear()在请求完成之前调用,我想停止请求.

现在,似乎视图在请求完成之前不会消失.有没有办法取消正在进行的GET/POST请求?

Mic*_*hal 16

是的,但你必须存储它以供外部访问 - 你可以使用task一种方法cancel(),就像你正在使用的那样resume().

因为viewDidDisappear()我建议将它作为对象属性 - var currentTask: NSURLSessionTask?在您的发送中,您将拥有self.currentTask = ...而不是let task = ...在您的viewDidDisappear()调用中self.currentTask?.cancel().