gpt4 book ai didi

ios - Swift DispatchGroup 导致错误 : [Firebase/Firestore][I-FST000001] Could not reach Cloud Firestore backend

转载 作者:行者123 更新时间:2023-11-28 11:37:16 27 4
gpt4 key购买 nike

我正在使用 Firebase 和 Firestore 通过以下方式读入数据:

var itemData: [String:Any]?
let docRef = db.collection("store").document(documentID)

let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
docRef.getDocument { (document, error) in
if let document = document, document.exists {
print("Document data: \(document.data() ?? ["key":"__data__"])")
itemData = document.data()
} else {
print("Document does not exist")
}
group.leave()
}
}
group.wait()
print("ITEM_DATA: \(itemData)")
return itemData

当我删除任何 DispatchGroup、group.enter() 等的所有引用时...代码运行正常,尽管不是按照我想要的顺序运行(即它运行 print("ITEM_DATA:\(itemData)") 行,itemData 为 nil,稍后才打印出 print("Document data:\(document.data() ?? ["key":"__data__"] )"))。所以我知道对 Firebase 的实际请求没有任何问题。

但是,当我尝试在写入之前解决打印/返回 itemData 的问题时,使用上面代码中的 DispatchGroup,当我运行该函数时,程序会给我错误代码:

[Firebase/Firestore][I-FST000001] Could not reach Cloud Firestore backend. Backend didn't respond within 10.000000 seconds.
This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.

收到这条消息后,程序再也没有连接到 Firestore。我已经用模拟器和有 wifi 和没有 wifi 的实际设备试过了,但无济于事。我知道这不是我的互联网连接的问题,因为当我使用 DispatchGroup 删除所有内容时它可以正常工作,但我仍然无法弄清楚问题是什么或如何解决这个问题。

最佳答案

尝试在同一个 Queue 中进入和离开 Dispatch Group

let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
docRef.getDocument { (document, error) in
if let document = document, document.exists {
print("Document data: \(document.data() ?? ["key":"__data__"])")
itemData = document.data()
} else {
print("Document does not exist")
}
group.leave()
}
}
group.wait()
print("ITEM_DATA: \(itemData)")

如果您想知道我对您的方法做了哪些更改?

看看在 DispatchQueue 异步闭包中移动的 enter 语句

可能导致问题的原因是什么?

进入不同队列中的调度组并在不同队列中离开调度组可能会导致问题

编辑 1:

嘿,刚刚测试了你的代码并让它工作

let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
sleep(10)
debugPrint("Hello")
group.leave()
}
group.notify(queue: DispatchQueue.main) {
print("ITEM_DATA: )")
}

这是控制台的输出序列

  1. “你好”
  2. ITEM_DATA: )

我知道我没有使用 wait() 并且 wait() 也应该可以工作但是我的工作不太忙所以现在不能用 wait 进行测试

编辑 2:

刚刚意识到 OP 打算使用 Dispatch group 从异步函数返回一个值,因此更新了我的答案

无论您应用什么逻辑,您都不能从异步调用中获得返回语句。调度组不会在这里帮助你,你在这里需要的只是一个 closureblock

func test(onCompletion completion: @escaping ([String:Any]) -> ()) {
DispatchQueue.global().async {
docRef.getDocument { (document, error) in
if let document = document, document.exists {
completion(document.data())
}
}
}
}

并称它为

    self.test {[weak self] (data) in
debugPrint(data)
}

希望对你有帮助

关于ios - Swift DispatchGroup 导致错误 : [Firebase/Firestore][I-FST000001] Could not reach Cloud Firestore backend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com