关闭ViewConttoller UI卡住了

问题描述 投票:1回答:2

我正在研究详细页面视图控制器,我正在研究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)
ios swift alamofire
2个回答
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得到了答案


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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.