2017-08-10 81 views
1

我在Swift中使用Twitter REST API,并且试图获取在Twitter请求中分配的变量的值闭包,这样我可以在闭包之外使用该值。如何获得在闭包中分配的变量的值(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永远是假的,甚至当它变为真正封闭的内部。如何在函数的末尾获取jsonAvailable的值,即使它在sendTwitterRequest闭包内部被修改?

我已经尝试在单独的函数中编写此闭包,然后调用函数来获取值,但是因为它是自定义闭包,需要通过“sendTwitterRequest”调用客户端,所以我发现很难全部通过这些所需的参数适合API。

感谢您的帮助!

回答

3

您的关闭是异步的。会发生什么情况是,您在sendTwitterRequest指定为jsonAvailable之前通过所有函数体,导致jsonAvailable为false。你需要做的是做一个回调,如果你愿意的话(或者把json本身作为一个nillable对象)提供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) 
}) 
+0

感谢您的答复!所以通过回调,你是指对另一个函数的调用,还是在函数结束时再次调用这个闭包? – tennis25

+0

回调函数是您作为参数传递给'jsonAvailable'的另一个闭包。在您的请求成功后,您将执行回调(jsonAvailable)。 @ tennis25增加了一个代码示例来展示我的意思。 –

相关问题