首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步执行GET请求

同步执行GET请求
EN

Stack Overflow用户
提问于 2018-01-13 00:04:28
回答 3查看 1.8K关注 0票数 1

我有一个向API发送GET请求的函数,我需要等待响应,然后才能继续我的其余代码。

我尝试了各种不同的线程,但没有得到它的工作。我一直在尝试自己解决这个问题,但我对线程和第四个线程感到非常困惑。

以下是我的函数:

代码语言:javascript
复制
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()
}
EN

回答 3

Stack Overflow用户

发布于 2018-01-13 00:21:03

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

代码语言:javascript
复制
func checkDomains(_ onResult: @escaping (Error?) -> Void)

然后,您可以在服务器返回成功、结果或错误的地方,在函数内部调用onResult。

代码语言:javascript
复制
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函数的地方传递回调参数

代码语言:javascript
复制
@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()
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-01-13 02:02:23

感谢您的回答。我刚回到家,意识到有一种更简单的方法可以做到这一点。

代码语言:javascript
复制
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总是会响应的。

票数 1
EN

Stack Overflow用户

发布于 2018-01-13 01:01:46

最近,异步进行网络调用是一种很好的做法。有一些技术可以让代码变得更简单,比如https://cocoapods.org/pods/ResultPromises TBC...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48229914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档