【问题标题】:Cannot get documents from Firestore in Swift无法从 Swift 中的 Firestore 获取文档
【发布时间】:2021-11-13 15:05:58
【问题描述】:

所以我试图从 Firestore 的特定集合中获取所有文档,但是在单步执行代码时,它跳过了该行并且不会引发错误。我在我的应用程序的其他部分成功使用了完全相同的代码,但由于某种原因它在这里不起作用?任何帮助将不胜感激。

func getClientEmail() -> String? {
        var clientEmail: String?
        
        self.db.collection("Clients").getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("error getting docs: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    let result = Result {
                        try document.data(as: User.self)
                    }
                    
                    switch result {
                    case .success(let client):
                        if let client = client {
                            if client.placementIDs[0] == self.user?.placementIDs[0] {
                                
                                clientEmail = client.email
                            }
                                } else {
                            print("Document doesn't exist")
                        }
                    case .failure(let error):
                        print("Error decoding user: \(error)")
                    }
                }
            }
        }
        
        return clientEmail
    }

经过一些测试,我将这段代码移到 viewDidLoad() 函数中并且它工作了......所以我认为它在被包装在一个函数中但不知道为什么,希望这些信息对你有所帮助任何能够解决此问题的人。

【问题讨论】:

  • 这个return clientEmail 是问题所在,它将在 Firebase 闭包中的代码之前执行。 Firebase 是异步的,因此您必须等待数据在闭包中返回,然后才能使用它。查看我的回答herethis

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

感谢Jay's 的评论,我设法通过将clientEmail 作为全局变量并使用完成处理程序在此函数中分配值来解决问题。

func getClientEmail() {
        // Get email of client for corresponding contractor
        db.collection("Clients").getDocuments(completion: { (querySnapshot, err) in
            if let err = err {
                print(err.localizedDescription)
                return
            } else {
                for document in querySnapshot!.documents {
                    let result = Result {
                        try document.data(as: User.self)
                    }
                    
                    switch result {
                    case .success(let client):
                        if let client = client {
                            if client.placementIDs[0] == self.user?.placementIDs[0] {
                                self.clientEmail = client.email
                            }
                        } else {
                            print("Document doesn't exist")
                        }
                    case .failure(let error):
                        print("Error decoding user: \(error)")
                    }
                }
            }
        })
    }

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多