【发布时间】:2020-05-13 07:49:19
【问题描述】:
我正在从 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 调用之外。也没有工作。
感谢所有帮助。
编辑:
将调用的方法更改如下,回调有效,但输出打印出我不想要的键、值和额外信息。我只需要这些值。有什么想法吗?
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)
}
}
【问题讨论】:
-
尝试使用等待调用完成并在完成时通知的调度队列。
-
这个
fetchedArray.append("\(child)")会将每个子快照附加到数组中(作为字符串?),这就是为什么您要获取每个子快照的所有数据。您的问题是“价值”;这很容易做到,但我们需要了解提出的价值和准确的解决方案。您能否包含您的 firebase 结构的 sn-p(请作为文本,没有图像)并指出您要获取的数据?此外,虽然 .value “有效”,但随着节点的增长,它可能包含大量数据,这可能会使设备不堪重负,因此应该避免这种情况。我有两个选择。 -
另外,你对数据做了什么?照原样,您将所有这些都转换为一个巨大的字符串数组,这并没有使它非常有用 - 也许它对您的用例有用?
标签: swift firebase networking closures completionhandler