在firestore中返回带有查询的文档

问题描述 投票:0回答:1

我想使用Firestore从函数返回文档。这是我的查询:

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
    let db = Firestore.firestore()

    let defaults = UserDefaults.standard
    let userId: String! = defaults.string(forKey: "UserUUID")

    var doc:DocumentSnapshot?
    db.collection("shoppingLists")
        .whereField("users." + userId, isEqualTo: true)
        .whereField("name", isEqualTo: name)
        .limit(to: 1)
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    print("\(document.documentID) => \(document.data())")
                    doc =  document
                    break
                }
            }
    }
    return doc
}

这显然是异步操作。返回和使用文档的正确方法是什么。通知?打回来?谢谢

swift firebase google-cloud-firestore
1个回答
2
投票

就像在DidLoad中一样,只需添加一个观察者

override func viewDidLoad()
    {
        super.viewDidLoad()

        //Add notification Observer to get status out of Async mode
        NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil)

    }

现在在你的功能

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
    let db = Firestore.firestore()

    let defaults = UserDefaults.standard
    let userId: String! = defaults.string(forKey: "UserUUID")

    var doc:DocumentSnapshot?
    db.collection("shoppingLists")
        .whereField("users." + userId, isEqualTo: true)
        .whereField("name", isEqualTo: name)
        .limit(to: 1)
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    print("\(document.documentID) => \(document.data())")
                    doc =  document
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil)
                    break
                }
            }
    }
    return doc
}

当Notification Observer获得该通知时 - 因此,将自动调用所需的函数

@objc func loadList(){
        //load data here    
    }

注意 - 不要忘记删除添加的Observer不需要时

操作完成后,第二个选项加载数据

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{
            let db = Firestore.firestore()

            let defaults = UserDefaults.standard
            let userId: String! = defaults.string(forKey: "UserUUID")

            var doc:DocumentSnapshot?
            db.collection("shoppingLists")
                .whereField("users." + userId, isEqualTo: true)
                .whereField("name", isEqualTo: name)
                .limit(to: 1)
                .getDocuments() { (querySnapshot, err) in
                    if let err = err {
                        print("Error getting documents: \(err)")
                    } else {
                        for document in querySnapshot!.documents {
                            print("\(document.documentID) => \(document.data())")
                            doc =  document
                            DispatchQueue.main.async {
                                //Load data here
                            }
                            break
                        }
                    }
            }
            return doc
        }
© www.soinside.com 2019 - 2024. All rights reserved.