快速返回完成块中的变量

Posted

技术标签:

【中文标题】快速返回完成块中的变量【英文标题】:Return a variable within a completion block swift 【发布时间】:2017-04-11 20:51:09 【问题描述】:
func observeActiveTrackingState() -> String

    let pathToObserveState = databaseRef.child("locationState").child("\(userID!)")

    pathToObserveState.observeSingleEvent(of: .value, with:  (snapshot) in

        let snapshotValue = snapshot.value as? NSDictionary

        print("Snapshot Returned (ObserveActiveTrackingState) = \(snapshotValue?["state"] as! String)")

        let currentState = snapshotValue?["state"] as! String

        return currentState //*****GIVES ME AN ERROR*****

        )
    //IF I PUT THE RETURN HERE HOW DO I CALL THE CURRENTSTATE VARIABLE

我有一个名为“observeActiveTrackingState”的函数,它应该返回一个字符串,通常在添加返回时它会返回我想要的字符串变量,但是因为我需要将返回语句放在下面

pathToObserveState.observeSingleEvent(of: .value, with:  (snapshot) in


    ) 

它返回一个错误并说它需要在 firebase 的完成块之外发生。如何修复此代码,以便在调用函数时获得所需的变量

【问题讨论】:

Returning data from async call in Swift function的可能重复 你根本不能这样做。您正在尝试使用异步方法的结果从同步方法返回。它不起作用。 @Fogmeister 有什么办法可以解决这个问题? 这个问题在堆栈溢出时已经被问过很多次了。这就是为什么我将其标记为重复。谷歌问题。你会得到答案的。 这不是 Firebase 的工作方式。您(通常)将希望在闭包内使用快照中返回的数据,这是它唯一有效的时间。避免添加回调和其他完成处理程序,因为它可能会产生其他问题。请参阅我对This question 的回答,因为它可能会提供一些见解。 【参考方案1】:

你应该使用一个闭包来接受你想要返回的类型的参数:

func observeActiveTrackingState(_ completion: (String) -> ()) 

    let pathToObserveState = databaseRef.child("locationState").child("\(userID!)")

    pathToObserveState.observeSingleEvent(of: .value, with:  (snapshot) in

        let snapshotValue = snapshot.value as? NSDictionary

        print("Snapshot Returned (ObserveActiveTrackingState) = \(snapshotValue?["state"] as! String)")

        let currentState = snapshotValue?["state"] as! String

        completion(currentState)

    )

//

你可以创建一个全局闭包变量并调用它:

    let state: (String) -> ()

    func observeActiveTrackingState() 

        let pathToObserveState = databaseRef.child("locationState").child("\(userID!)")

        pathToObserveState.observeSingleEvent(of: .value, with:  (snapshot) in

            let snapshotValue = snapshot.value as? NSDictionary

            print("Snapshot Returned (ObserveActiveTrackingState) = \(snapshotValue?["state"] as! String)")

            let currentState = snapshotValue?["state"] as! String

            self.state(currentState)

        )
    

【讨论】:

到目前为止它似乎工作但是我如何在代码中调用它,例如我希望能够在“viewDidLoad”中为这个函数设置一个变量。 " let ActiveState = observeActiveTrackingState() " 当我这样做时,我得到一个错误,说没有初始化程序 @BrandonMayU 这些都是之前已经回答过很多次的问题。您最好阅读 Apple 免费提供的 Swift 书籍。

以上是关于快速返回完成块中的变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 AFNetworking 块中的变量都显示为 nil(快速)?

Java中,finally在try语句块中的return前执行还是后执行

异常处理关于return语句的执行顺序注意事项

IOS/Objective-C:从完成块中检索 NSArray

指定返回时,位置块中的 auth_basic 不起作用?

如果我在 Try 块中返回一个值,Finally 语句中的代码会触发吗?