使用 API 的 background/main 线程出错

Error in background/main thread using API

我尝试调用我的 API,但出现错误:

Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.

我知道我需要调用DispatchQueue,但我不明白我需要在哪里使用它。

我的代码:

let currentUser = Auth.auth().currentUser
currentUser?.getIDTokenForcingRefresh(true, completion: { (idToken, error) in
    if let err = error {
        self.unknownError(error: err)
    } else {
        var request = URLRequest(url: URL(string: "https://phss.ru/api/booking/cancel")!)
        request.httpMethod = "POST"
        let cancelBooking: [String: Any] = ["booking_id": self.documentIDs]
        let jsonData = try! JSONSerialization.data(withJSONObject: cancelBooking, options: [])
        request.httpBody = jsonData
        request.addValue("Bearer \(idToken!)", forHTTPHeaderField: "Authorization")
        let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
            if let err = error {
                self.unknownError(error: err)
            } else {
                let alertController = UIAlertController(title: NSLocalizedString("Cancel successful", comment: "Cancel successful"), message: "", preferredStyle: .alert) 
                alertController.addAction(UIAlertAction(title: NSLocalizableOk, style: .cancel, handler: nil))
                self.present(alertController, animated: true, completion: nil)
            }
        })
    task.resume()
    }
})

您需要在主线程上显示您的 UIAlertController,因为 URLSession.shared.dataTask(with:completionHandler:) 的完成回调在后台线程上运行。

DispatchQueue.main.async {
   let alertController = UIAlertController(title: NSLocalizedString("Cancel successful", comment: "Cancel successful"), message: "", preferredStyle: .alert) 
   alertController.addAction(UIAlertAction(title: NSLocalizableOk, style: .cancel, handler: nil))
   self.present(alertController, animated: true, completion: nil)
}