我有一个向API发送GET请求的函数,我需要等待响应,然后才能继续我的其余代码。
我尝试了各种不同的线程,但没有得到它的工作。我一直在尝试自己解决这个问题,但我对线程和第四个线程感到非常困惑。
以下是我的函数:
func checkDomains() {
let endings = [".com"]
for ending in endings {
let domainName = names[randomNameIndx] + ending
let urlString = "https://domainr.p.mashape.com/v2/status?mashape-key={my-key}" + domainName
let url = URL(string: urlString)
var request = URLRequest(url: url!)
request.setValue("{my-key}", forHTTPHeaderField: "X-Mashape-Key")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.httpMethod = "GET"
var ourBool = false
DispatchQueue.main.sync {
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, er) in
do {
print("hey")
if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
ourBool = String(describing: json).contains("inactive")
if ourBool {
self.domainStatuses.append("available")
} else {
self.domainStatuses.append("taken")
}
}
} catch {
}
})
task.resume()
}
}
}
@objc func btnTapped(sender: UIButton) {
self.prepareForNewName()
sender.shake(direction: "horizontal", swings: 1)
self.checkDomains() // This needs to finish before calling the next functions
self.setupForNewName()
self.animateForNewName()
}发布于 2018-01-13 00:21:03
我的建议是在异步函数中添加回调参数。示例如下:
func checkDomains(_ onResult: @escaping (Error?) -> Void)然后,您可以在服务器返回成功、结果或错误的地方,在函数内部调用onResult。
func checkDomains(_ onResult: @escaping (Error?) -> Void) {
...
let task = URLSession.shared.dataTask ... {
do {
//Parse response
DispatchQueue.main.async { onResult(nil) }
} catch {
DispatchQueue.main.async { onResult(error) }
}
...
}
}最后需要在调用checkDomains函数的地方传递回调参数
@objc func btnTapped(sender: UIButton) {
self.prepareForNewName()
sender.shake(direction: "horizontal", swings: 1)
self.checkDomains { [unowned self] error in
if let error = error {
// handle error
return
}
self.setupForNewName()
self.animateForNewName()
}
}发布于 2018-01-13 02:02:23
感谢您的回答。我刚回到家,意识到有一种更简单的方法可以做到这一点。
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
do {
...
if response != nil {
DispatchQueue.main.async {
self.setupForNewName()
self.animateForNewName()
}
}
}
} catch {
print(error)
}
})
task.resume()当然,这取决于API的响应,但我相信API总是会响应的。
发布于 2018-01-13 01:01:46
最近,异步进行网络调用是一种很好的做法。有一些技术可以让代码变得更简单,比如https://cocoapods.org/pods/ResultPromises TBC...
https://stackoverflow.com/questions/48229914
复制相似问题