如何获取在闭包中分配的变量的值(Swift)

时间:2017-08-10 15:01:19

标签: ios swift twitter swift3 closures

我在Swift中使用Twitter REST API,并且我试图获取在Twitter Request闭包内分配的变量的值,以便我可以在闭包之外使用该值。

我从位于:https://dev.twitter.com/twitterkit/ios/access-rest-api

的Swift的Twitter REST API教程中获取了此代码
func jsonAvailable() -> Bool {
    // Swift
    let client = TWTRAPIClient()
    let statusesShowEndpoint = "https://api.twitter.com/1.1/statuses/show.json"
    let params = ["id": "20"]
    var clientError : NSError?

    var jsonAvailable: Bool = false
    let request = client.urlRequest(withMethod: "GET", url: 
    statusesShowEndpoint, parameters: params, error: &clientError)

    client.sendTwitterRequest(request) { (response, data, connectionError)-> Void in
    if connectionError != nil {
        print("Error: \(connectionError)")
    }

    do {
        let json = try JSONSerialization.jsonObject(with: data!, options: [])
        print("json: \(json)")
        jsonAvailable = true
    } catch let jsonError as NSError {
        print("json error: \(jsonError.localizedDescription)")
    }

    print("Value of jsonAvailable: \(jsonAvailable)")
    return jsonAvailable
    //always returns false, even if it is changed to true inside of the closure
}

在最后一行中,jsonAvailable始终为false,即使在闭包内更改为true也是如此。如何在函数末尾获取jsonAvailable的值,即使它在sendTwitterRequest闭包内被修改了?

我尝试在一个单独的函数中编写这个闭包,然后调用函数来获取值,但是因为它是一个自定义闭包,需要通过" sendTwitterRequest"来调用客户端。我发现很难通过所有这些必需的参数来适应API。

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

你的闭包是异步的。会发生的事情是,在sendTwitterRequestjsonAvailable指定true之前,您会检查所有函数体,导致jsonAvailable为false。您需要做的是改为使用回调,如果您愿意,则提供json状态(或者json本身作为可用对象)。

编辑:您可以拥有类似的内容

func jsonAvailable(callback: ((_ isJsonAvailable: Bool) -> Void)) {
    client.sendTwitterRequest(request) { (response, data, connectionError)-> Void in {
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: [])
            print("json: \(json)")
            callback(true)
        } catch let jsonError as NSError {
            print("json error: \(jsonError.localizedDescription)")
            callback(false)
        }
    }
}

jsonAvailable(callback: { (_ isJsonAvailable: Bool) in
    print(isJsonAvailable)
})