我正在研究详细页面视图控制器,我正在研究2种不同的API。当api加载完成到我的主页之前我解除了我的视图控制器时,我的主页的用户界面停留了一段时间。我确实取消了我的api请求,但它没有工作。
代码://在呈现的viewcontroller中解散
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)
有两种方法可以取消任务。
在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得到了答案
使用以下代码,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)
}