在关闭后,ViewConttoller UI卡住了

时间:2019-02-27 07:25:53

标签: ios swift alamofire

我正在使用详细信息页面视图控制器,其中我正在使用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)

2 个答案:

答案 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)
    }