【问题标题】:Swift function to return documents from Firestore从 Firestore 返回文档的 Swift 函数
【发布时间】:2021-10-09 06:58:15
【问题描述】:

更新 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”返回它们?

【问题讨论】:

  • 我认为是func fetchMyData() -> [MyModel]{
  • querySnapshot?.documents 和你所谓的 MyModel 有什么关系?
  • @RajaKishan - 这给了我这个错误:“ListenerRegistration”不能转换为“[MyModel]”
  • @ElTomato 我不确定我是否理解你的问题

标签: swift google-cloud-firestore


【解决方案1】:

如果“我希望这个函数返回结果而不是打印它们。”意味着您需要一个 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
        }
    }

【讨论】:

  • 现在我得到 queryDocumentSnapshot 行的 'Cannot find 'queryDocumentSnapshot' in scope'
  • 酷,这么几件事:1)我不得不将转义(MyModel?)更改为转义([MyModel]?)。 2) 我收到警告“从未使用过捕获'self'”和 3) 我如何实际使用此功能?调用它时,它希望我插入“完成: Void#>'
  • 使用如下函数:fetchMyData() { arr in if let myModelArray = arr { // do something with your [MyModel] myModelArray } }你能编辑你的问题并显示你现在使用的代码吗?
  • 并添加了评论。
  • 所以你没有像你说的那样将转义改为 ([MyModel]?)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2020-04-07
  • 2019-11-23
相关资源
最近更新 更多