【问题标题】:How to get the value of the variable that is assigned in a closure (Swift)如何获取在闭包中分配的变量的值(Swift)
【发布时间】:2018-01-18 21:55:05
【问题描述】:

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

我从 Swift 的 Twitter REST API 教程中获得了这段代码,位于:https://dev.twitter.com/twitterkit/ios/access-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 所需的参数。

感谢您的帮助!

【问题讨论】:

    标签: ios swift twitter swift3 closures


    【解决方案1】:

    你的闭包是异步的。发生的情况是,您在 sendTwitterRequest 将 true 分配给 jsonAvailable 之前遍历了所有函数体,导致 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)
    })
    

    【讨论】:

    • 感谢您的回复!那么回调是指调用另一个函数,还是在函数结束时再次调用这个闭包?
    • 回调是您作为参数传递给jsonAvailable 的另一个闭包。请求成功后,您将执行回调(jsonAvailable)。 @tennis25 添加了一个代码示例来展示我的意思。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多