swift - 从 Firestore 返回文档的 Swift 函数
问题描述
更新 2:
让这件事发挥作用。没有我预期的那么优雅,但有效。
最后的函数是这样的:
func fetchData(completion: @escaping ([MyModel]?) -> Void) {
self.db
.collection("data/userData")
.order(by: "modified", descending: true)
.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("no documents \(String(describing: error))")
completion(nil)
return
}
let result = documents.compactMap { queryDocumentSnapshot -> MyModel? in
return try? queryDocumentSnapshot.data(as: MyModel.self)
}
completion(result)
}
}
像这样称呼它:
fetchData() { arr in if arr != nil {
//Attach it to vars or whatever
}}
我正在接受@workingdog 的回答。
更新1:编辑:在@workingdog 评论之后,我尝试使用此代码:
func fetchMyData(completion: @escaping ([MyModel]?) -> Void) {
self.db
.collection("data/userData")
.order(by: "modified", descending: true)
.addSnapshotListener { [self] querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("no documents \(String(describing: error))")
completion(nil)
return
}
let result = documents.compactMap { queryDocumentSnapshot -> MyModel? in
return try? queryDocumentSnapshot.data(as: MyModel.self)
}
completion(result)
}
}
这仍然没有给我一个解决方案,因为我试图从不同的函数调用这个方法,但是它使我的应用程序崩溃。而且,我只想用“var myDocuments = fetchData()”来调用它。上面的代码没有给我这个(尽管我什至不确定我要问的是可能的)。
我有这个代码/查询应该从 Firestore 返回文档:
func fetchMyData() {
self.db
.collection("data/userData")
.order(by: "modified", descending: true)
.addSnapshotListener { [self] querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("no documents \(String(describing: error))")
return
}
print(documents.compactMap { (queryDocumentSnapshot) -> MyModel? in
return try? queryDocumentSnapshot.data(as: MyModel.self)
})
}
}
我希望这个函数返回结果而不是打印它们。我试图将它们推入一个高级变量(self.myDocuments),但是当项目变得更大并且许多其他函数尝试根据自己的需要运行此查询时,这并不好。
我尝试使用:
return documents.compactMap { (queryDocumentSnapshot) -> MyModel? in
return try? queryDocumentSnapshot.data(as: MyModel.self)
}
但收到此错误消息:
void 函数中出现意外的非 void 返回值
我知道“compactMap”不能返回任何东西,但我还能做些什么来获取这些文档并让“fetchMyData”返回它们?
解决方案
如果“我希望这个函数返回结果而不是打印它们。” 意味着您期望一个 MyModel,然后尝试这样的事情:
编辑:返回一个可选的 MyModel 数组:
func fetchMyData(completion: @escaping ([MyModel]?) -> Void) {
self.db
.collection("data/userData")
.order(by: "modified", descending: true)
.addSnapshotListener { [self] querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("no documents \(String(describing: error))")
completion(nil)
return
}
let result = documents.compactMap { queryDocumentSnapshot -> MyModel? in
return try? queryDocumentSnapshot.data(as: MyModel.self)
}
completion(result)
}
}
像这样使用它:
fetchMyData() { results in
if let modelArray = results {
// do something with your [MyModel] modelArray
}
}
推荐阅读
- jquery-ui - 如果在第一次放置时放入可放置的对象中,如何销毁克隆的元素?
- go - 为什么我的包中的功能不起作用
- css - CSS 样式未应用于视图
- php - 获取所有行,但将特定行放在堆顶
- android - 推送通知科特林
- machine-learning - 如何在 Pytorch 中使用 torch.nn.Sequential 实现我自己的 ResNet?
- laravel - Indipay 参数丢失异常
- string - bash 文件子字符串仅在匹配项中添加/替换
- html - 如何慢慢改变单词颜色?
- python - 有什么方法可以在 OpenCV 的轮廓检测中只检测矩形,而忽略其他文本检测?