在swift中返回firestore documentID的正确方法是什么?

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

我想创建一个函数,它将返回给定字段值的documentID。我厌倦了我的嵌套函数。有一种简单的方法可以让一个函数返回ID吗?

这就是我一直在做的事情。这是一个丑陋的模式。

public class func getAccountItems(accountName:String) {
    let db = Firestore.firestore()

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

    db.collection("Portfolios")
        .whereField("users." + userId, isEqualTo: true)
        .limit(to: 1)
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                var documentID:String? = nil

                for document in querySnapshot!.documents {

                    print("\(document.documentID) => \(document.data())")
                    documentID = document.documentID

                    if(documentID != nil){

                        do {
                            let db = Firestore.firestore()

                            let defaults = UserDefaults.standard
                            let portfolioId: String! = defaults.string(forKey: listDocKey)

                            db.collection("Portfolios").document(portfolioId).collection("Accounts").whereField("name", isEqualTo: accountName)
                                .getDocuments(){ (querySnapshot, err) in
                                    if let err = err {
                                        print("Error getting documents: \(err)")
                                    } else {
                                        if querySnapshot!.documents.count == 1 {
                                            for document in querySnapshot!.documents {

                                                db.collection("Portfolios").document(documentID!).collection("Accounts").document(document.documentID).collection("Items")
                                                    .getDocuments() { (querySnapshot, err) in
                                                        if let err = err {
                                                            print("Error getting documents: \(err)")
                                                        } else {
                                                            var items:[INDX01FirestoreService.PortfolioItem] = []
                                                            for document in querySnapshot!.documents {
                                                                print("\(accountName): \(document.documentID) => \(document.data())")
                                                                let pi = try! FirestoreDecoder().decode(INDX01FirestoreService.PortfolioItem.self, from: document.data())

                                                                items.append(pi )
                                                            }
                                                            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AccountItemsReceived"), object: nil, userInfo: ["items": items])

                                                        }
                                                }

                                            }
                                        }else{
                                            print ("Error count is \(querySnapshot!.documents.count)")
                                        }

                                    }

                            }
                        }

                    }
                }
            }
    }
}    

由于Firestore是异步调用,我要么这样做,要么发送通知。我不喜欢在整个地方发送通知。

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

不能发表评论,但有一件事你为什么有这么多数据库引用

let db = Firestore.firestore()

这应该像你一样给你文件的ID

documentID = document.documentID

在这里发布您的数据结构的样子以及您想要获得的ID也要记住,您应该在每个文档中存储id。

enter image description here

我试着帮助你。


0
投票

我决定将documentID存储在UserDefaults中,因为它处理大多数用例。否则我会执行上述操作,搜索,查找,然后处理

© www.soinside.com 2019 - 2024. All rights reserved.