如何取消 Swift 中正在进行的 HTTP 请求?
How to cancel on-going HTTP request in 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()
})
}
}
如果 viewWillDisappear()
在请求完成之前被调用,我想停止请求。
目前看来,在请求完成之前视图并没有消失。有没有办法取消正在进行的 GET/POST 请求?
是的,但是您必须存储它以供外部访问 - task
有一个您可以使用的方法 cancel()
,就像您使用 resume()
.
对于 viewDidDisappear()
我建议将其作为对象 属性 - var currentTask: NSURLSessionTask?
,在您的调度中您将使用 self.currentTask = ...
而不是 let task = ...
并且在你的 viewDidDisappear()
你会打电话给 self.currentTask?.cancel()
.
我的代码 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()
})
}
}
如果 viewWillDisappear()
在请求完成之前被调用,我想停止请求。
目前看来,在请求完成之前视图并没有消失。有没有办法取消正在进行的 GET/POST 请求?
是的,但是您必须存储它以供外部访问 - task
有一个您可以使用的方法 cancel()
,就像您使用 resume()
.
对于 viewDidDisappear()
我建议将其作为对象 属性 - var currentTask: NSURLSessionTask?
,在您的调度中您将使用 self.currentTask = ...
而不是 let task = ...
并且在你的 viewDidDisappear()
你会打电话给 self.currentTask?.cancel()
.