Swift,带有完成处理程序的网络调用无法工作。

问题描述 投票:0回答:1

我正在从Firebase中读取数据,并希望使用一个闭包来意识到何时调用完成。我的代码是这样的。

func fetchGameTexts(gameType : String, completion: @escaping ([String]) -> ()){
    var fetchedArray = [String]()

    ref.child("GameTexts").child("JagHarAldrig").observe(.childAdded) { (snapshot, error) in
        if let userDict = snapshot.value as? [String:Any] {
            let userDictValue = userDict.values
            fetchedArray.append("\(userDictValue.first!)")

        }
        completion(fetchedArray)
    }

}

调用函数

let FetchGameText = FetchGameTexts()
    FetchGameText.fetchGameTexts(gameType : "JagHarAldrig") { fetchedArray in
        print("inside completion handler : \(fetchedArray)")
    }

现在网络调用按预期工作了,但完成处理程序没有工作,它一次又一次地打印数组,而不是在调用完成时打印。

我试着把 "completion(fetchedArray) "移到if let块里面,也移到ref调用外面。也没有成功。

感谢大家的帮助。

EDIT:

把调用的方法改成了下面的样子,回调成功了,但是输出打印了键,值和额外的信息,我不想要。我只需要值。有什么好办法吗?

func fetchGameTexts(gameType : String, completion: @escaping ([String]) -> ()){
    var fetchedArray = [String]()

    ref.child("GameTexts").child(gameType).observe(.value) { (snapshot, error) in

        for child in snapshot.children {
            fetchedArray.append("\(child)")
        }
        completion(fetchedArray)
    }
}
swift firebase networking closures completionhandler
1个回答
1
投票

似乎你实现完成和Firebase调用的方式没有问题。每当父体发生变化时,完成块就会被多次调用(或者如果我没记错的话,它将为你当前拥有的每一个子体在开始时被调用),因为你在监听 .childAdded. 它将继续这样做,直到你把监听器从 ref.

我的假设是,你想获取所有的孩子,所以你需要使用 .value 以便一次性获得所有的信息。

为此,这个可能也会有帮助。https:/firebase.google.comdocsdatabaseioslists-of-data。

© www.soinside.com 2019 - 2024. All rights reserved.