Ios 如何在swift 5的完成区块内向用户显示警报

Ios 如何在swift 5的完成区块内向用户显示警报,ios,swift,background,uialertcontroller,Ios,Swift,Background,Uialertcontroller,我有一个应用程序,可以对web服务器进行API调用。我终于让API调用正常工作,现在可以解析服务器返回的JSON数据了,但如果请求失败,我只能尝试向用户显示警报。例如,我的服务器可以返回{“success”:false,“error”:“您没有很好地询问”}显然,该错误不是真实的,而是可以返回的内容的表示。我只能检查URLSession.shared.dataTask的completion块中的错误,但是如果我试图从内部显示一个警报,我会收到一个错误,即我无法从UI上的后台线程执行任何操作 代码

我有一个应用程序,可以对web服务器进行API调用。我终于让API调用正常工作,现在可以解析服务器返回的JSON数据了,但如果请求失败,我只能尝试向用户显示警报。例如,我的服务器可以返回{“success”:false,“error”:“您没有很好地询问”}显然,该错误不是真实的,而是可以返回的内容的表示。我只能检查URLSession.shared.dataTask的completion块中的错误,但是如果我试图从内部显示一个警报,我会收到一个错误,即我无法从UI上的后台线程执行任何操作

代码现在相当简单

URLSession.shared.dataTask(with: self.request) { (data, response, error) in 
    if let error = error {
        completion(.failure(error))
        return
    }
    //continue on with processing the response...
    completion(.success(fullResponse))
}.resume()
然后在我的呼叫代码中我有

connector.connect(pin) { (result) in
    switch(result) {
    case .success(let response):
        if let response = response {
            if response.success {
                //do things
            } else {
                self.alert(title: "Error while connecting", message: response.error)
            }
         }
    case .failure(let error):
        self.alert(title: "Unable to connect", message: error)
  }
}

这导致了一个错误,即我无法从后台线程在ui线程上执行任何操作。如果是这样,我如何让用户知道API调用失败?我必须能够通知用户。谢谢。

您需要将其包装在
DispatchQueue.main.async
中,作为
URLSession.shared.dataTask的回调在后台线程中发生

DispatchQueue.main.async {
   self.alert(title: "Error while connecting", message: response.error)
}
同样适用于

self.alert(title: "Unable to connect", message: error)

但是最好将主队列中的
alert
函数中的所有代码包装为一个位置

您需要将其包装在
DispatchQueue.main.async
中,作为
URLSession.shared.dataTask
的回调在后台线程中发生

DispatchQueue.main.async {
   self.alert(title: "Error while connecting", message: response.error)
}
同样适用于

self.alert(title: "Unable to connect", message: error)

但是最好将主队列中的
alert
函数中的所有代码包装为一个位置

这里有一种不同的方法,您可以使用它,而不是在
连接器.connect(pin)上调用
DispatchQueue.main.async
的回调您也可以在调用
dataTask
上的
completion
块之前这样做

URLSession.shared.dataTask(with:self.request){(数据、响应、错误)在
如果let error=error{
DispatchQueue.main.async{
完成(.failure(error))
}
回来
}
//继续处理响应。。。
DispatchQueue.main.async{
完成(.success(fullResponse))
}
}1.简历()
通过这样做,连接器.connect(pin)
中的代码将不会被放置在末日金字塔中,完成块中的所有内容都在主线程上运行

连接器。连接(引脚){导致
//这里的一切都在主线上了
}

您可以使用另一种方法,而不是在
connector.connect(pin)
的回调上调用
DispatchQueue.main.async
,您也可以在调用
数据任务的
completion
块之前这样做

URLSession.shared.dataTask(with:self.request){(数据、响应、错误)在
如果let error=error{
DispatchQueue.main.async{
完成(.failure(error))
}
回来
}
//继续处理响应。。。
DispatchQueue.main.async{
完成(.success(fullResponse))
}
}1.简历()
通过这样做,连接器.connect(pin)
中的代码将不会被放置在末日金字塔中,完成块中的所有内容都在主线程上运行

连接器。连接(引脚){导致
//这里的一切都在主线上了
}

漂亮!谢谢你,美女!谢谢你,美女。我没有那样想过。谢谢你,先生@如果你喜欢的话,你可以投票给我的答案。我没有那样想过。谢谢你,先生@如果你喜欢的话,你可以投票给我的答案。