我想在后台应用程序中取消Http
连接。
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "my url")
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
guard error == nil else {
print(error)
return
}
guard let data = data else {
print("Data is empty")
return
}
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
print("ASynchronous\(jsonResult)")
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
task.resume()
}
如何在程序中的任何位置取消它?
答案 0 :(得分:1)
执行此操作的方法是保留对任务的引用,而不是本地的任务'。
例如,在viewDidLoad之外创建:
var taskToReference: NSURLSessionDataTask!
然后更改代码而不是let task = URLSession...
代替taskToReference = URLSession...
。
现在您有一个可以在视图控制器内的任何位置使用的引用var。只需在班上的任何地方taskToReference.cancel()
。
要在整个应用程序中从任何视图中执行此操作,而不是在类中创建var,请在AppDelegate中创建并在那里保留引用!
在你的app delegate:
var taskToReference: NSURLSessionDataTask!
然后在viewDidLoad中,在引用app-wide var之前获取对app delegate的引用:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
然后将您的初始任务更改为:
appDelegate.taskToReference = URLSession...