首页 > 解决方案 > 从 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”返回它们?

标签: swiftgoogle-cloud-firestore

解决方案


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

推荐阅读