ios - 同步执行GET请求

标签 ios swift synchronous

我有一个向 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()
}

最佳答案

我的建议是将回调参数添加到您的异步函数中。示例如下:

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()
    }
}

关于ios - 同步执行GET请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229914/

相关文章:

c# - 如果静态只读成员调用静态方法获取值,是否同步完成?

ios - 根据 UISlider 值更改 UILabel 的案例语句

ios - 使用已安装的 xCon 进行越狱检测

ios - 如何在新搜索中取消 uitableviewcells 的异步图像加载

android - 如何同步获取WorkManager状态

android - 如何以同步方式与监听器一起工作?

ios - Xcode 7.3库项目每次编译

ios - 没有互联网的 MPTweakValue

ios - 尝试用 GCD 创建一个准确的计时器

swift - 在 OS X 上设置 PerfectlySoft Swift 时出错