我正在使用详细信息页面视图控制器,其中我正在使用2种不同的API。当我在api加载完成到主页之前关闭视图控制器时,主页的UI停留了一段时间。我确实在取消时取消了api请求,但它不起作用。
代码://在关闭时显示的视图控制器内
let sessionManager = Alamofire.SessionManager.default
sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { $0.cancel() }
uploadTasks.forEach { $0.cancel() }
downloadTasks.forEach { $0.cancel() }
}
self.dismiss(animated: true, completion: nil)
答案 0 :(得分:1)
您可以通过两种方式取消任务。
在alamofire中,您需要获取所有任务并检查任务是否可用(如果可用),请删除并撤消到以前的VC。例如
Alamofire.SessionManager.default.session.getAllTasks { (tasks) in
tasks.forEach { if ($0.originalRequest?.url?.absoluteString == "yourURLName") { $0.cancel() } }
self.dismiss(animated: true, completion: nil)
}
选项2
检查您当前的任务是上载还是下载或数据任务,根据任务将其删除之前将其删除,例如
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
dataTasks.forEach { if ($0.originalRequest?.url?.absoluteString == "yourURLName") { $0.cancel() } }
self.dismiss(animated: true, completion: nil)
}
我从here那里得到了答案
答案 1 :(得分:0)
使用以下代码,Alamofire取消在后台线程上触发的请求,因此您的UI在主线程中更新。
override func viewWillDisappear(_ animated: Bool) {
DispatchQueue.global(qos: .background).async {
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
sessionDataTask.forEach { $0.cancel() }
uploadData.forEach { $0.cancel() }
downloadData.forEach { $0.cancel() }
}
}
self.dismiss(animated: true, completion: nil)
}