【发布时间】:2020-01-03 19:09:15
【问题描述】:
我正在使用 firebase,我有一个函数可以从文档引用中返回一个承诺。
func getCatalogItem(ref: DocumentReference) -> Promise<Catalog> {
return Promise { seal in
ref.getDocument() { result, err in
if err != nil {
seal.reject(err!)
} else {
let data = FirestoreDecoder()
do {
let item = try data.decode(Catalog.self, from: result!.data()!)
seal.fulfill(item)
} catch {
print("Error")
}
}
}
}
}
它工作正常,但唯一的问题是返回类型是我从文档引用调用中解码的自定义类型,但调用本身是同步的,它使我的应用程序崩溃并出现 nil 错误,因为数据实际上还没有.
这是产生错误的行和函数(nil)
let item = try data.decode(Catalog.self, from: result!.data()!)
我尝试使用 firebase 函数的处理程序创建另一个函数并将该值传递给解码器,但它也返回 nil,并且(我正在使用 awaitkit/promisekit)我尝试搞乱 async/await 但不能让它发挥作用。我该如何解决这个问题?
然后我有这个:
let featureditem = Firestore.firestore().collection("catalog").document("TDS faded jeans")
self.featureditem.getDocument() { doc, err in
if doc == doc {
let item = try! FirestoreDecoder().decode(Catalog.self, from: doc!.data()!)
print("\(item)")
这也给了我零。
【问题讨论】:
-
我建议你避免使用强制展开运算符(
!)。尤其是避免在一条线上多次使用,这使得很难弄清楚是什么失败了。所以,首先解开result(例如guard let result = result else { print("result was nil"); seal.reject(...); return }。然后使用相同的模式解开data()返回的任何内容。然后查看您的解码器返回的内容(我将其从data重命名为decoder以避免混淆),如果它走得那么远。 -
不相关,但您可能希望在您的
catch语句中使用reject,例如seal.reject(error)。如果你要去print任何东西,我可能会打印实际错误,而不仅仅是字符串文字"Error"。 -
好的,我一定会回去做那些我更担心为什么我不应该这样做的时候得到 nil 的事情,但你的权利也许对我的调试有帮助
-
啊,我发现问题出在我的编码键中,但是当我强制打开它时它没有引发错误。谢谢@Rob
标签: swift asynchronous google-cloud-firestore swiftui