【问题标题】:How to return data in array from Firestore?如何从 Firestore 返回数组中的数据?
【发布时间】:2019-07-25 01:51:01
【问题描述】:

我正在构建一个 IOS 应用程序,我正处于想要在选择器视图中加载一些类别的阶段。类别列表作为文档存储在 Firestore 中。

我有一个执行以下操作的函数:

  1. 初始化一个数组
  2. 从 Firestore 读取数据
  3. 为数组添加值
  4. 返回数组

问题是该函数似乎返回数组,甚至没有从 Firestore 获得任何结果

我的数据模型

class categoryModel {
    var catImg=""
    var catName=""
    var catID=""
    //set categories
    init(catImg: String, catName:String, catID:String){
        self.catName=catName
        self.catImg=catImg
        self.catID=catID
    }
}

Firestore 参考

struct FirestoreReferenceManager {

    static let event = "events"

    static let db = Firestore.firestore()
    static let rootEvents = db.collection("events")
    static let rootUsers = db.collection("users")

}

Firestore 服务

class FirestoreService {

    static func getCategoryfromDB()->[categoryModel] {

        let rootCategory = FirestoreReferenceManager.rootEvents
        var tabCategory=[categoryModel]()


        rootCategory.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    tabCategory.append(categoryModel(catImg: document.data()["img"] as! String, catName:document.data()["name"] as! String, catID: document.documentID))

                    print("number of categories running: \(tabCategory.count)")
                }
            }

        }
        print("number of categories final: \(tabCategory.count)")
        return tabCategory
    }
}

检查日志显示的内容

umber of categories final: 0
number of categories final: 0
number of categories running: 1
number of categories running: 2
number of categories running: 3
number of categories running: 4
number of categories running: 5
number of categories running: 6
number of categories running: 7
number of categories running: 8
number of categories running: 9
number of categories running: 10
number of categories running: 11
number of categories running: 1
number of categories running: 2
number of categories running: 3
number of categories running: 4
number of categories running: 5
number of categories running: 6
number of categories running: 7
number of categories running: 8
number of categories running: 9
number of categories running: 10
number of categories running: 11

前 2 行实际上应该是最后一行。

当我从视图控制器读取 Firestore 时,数组为空。我尝试对数据模型进行硬编码,它运行良好。

我读到了一些关于获取数据的“延迟”,但是如何解决这个问题?

我该如何解决这个问题?

【问题讨论】:

标签: ios swift firebase google-cloud-firestore read-data


【解决方案1】:

这样的事情应该可以做到。 dispatch 是一个你可以添加闭包的组。一旦所有这些都完成,就会调用通知闭包,您可以在其中返回数据。 阅读调度组,这将有所帮助。

static func getCategoryfromDB(completed: @escaping ([categoryModel]) -> Void) {

        let rootCategory = FirestoreReferenceManager.rootEvents
        var tabCategory=[categoryModel]()
        let dispatch = DispatchGroup()
        dispatch.enter()
        rootCategory.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    tabCategory.append(categoryModel(catImg: document.data()["img"] as! String, catName:document.data()["name"] as! String, catID: document.documentID))

                    print("number of categories running: \(tabCategory.count)")
                }
            }
            dispatch.leave()

        }
        dispatchGroup.notify(queue: .main, execute: {
            print("number of categories final: \(tabCategory.count)")
            completed(tabCategory)

        })


        }

【讨论】:

  • 谢谢。我更新了通知功能(有错误消息,但现在程序甚至没有读取集合。它直接从 rootCategory.getDOcuments() 到通知,甚至没有打印
【解决方案2】:

感谢@arvidure 和其他人,我设法让下面的代码有效

我的数据模型

class categoryModel {
    var catImg=""
    var catName=""
    var catID=""
    //set categories
    init(catImg: String, catName:String, catID:String){
        self.catName=catName
        self.catImg=catImg
        self.catID=catID
    }
}

Firestore 参考

struct FirestoreReferenceManager {

    static let event = "events"

    static let db = Firestore.firestore()
    static let rootEvents = db.collection("events")
    static let rootUsers = db.collection("users")

}

Firestore 服务

class FirestoreService {

    static func getCategoryfromDB(dispatch:DispatchGroup, completed: @escaping ([categoryModel]) -> Void) {

        let rootCategory = FirestoreReferenceManager.rootEvents
        var tabCategory=[categoryModel]()
        //let dispatch = DispatchGroup()

        dispatch.enter()

        rootCategory.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    tabCategory.append(categoryModel(catImg: document.data()["img"] as! String, catName:document.data()["name"] as! String, catID: document.documentID))

                    print("number of categories running: \(tabCategory.count)")
                }
            }  
            dispatch.leave()
        }

        dispatch.notify(queue: .main, execute: {
            print("number of categories : \(tabCategory.count)")
            completed(tabCategory)

        })

    }
}

这就是我在视图控制器中的称呼

super.viewDidLoad()

        let dispatch = DispatchGroup()
        category=CategoryModelPicker()
        //category.modelCategory=categoryData.getCategory()
        //category.modelCategory=FirestoreService.getCategoryfromDB(completed: category?.modelCategory)
        FirestoreService.getCategoryfromDB(dispatch:dispatch){(cat) in
            dispatch.notify(queue: .main, execute: {
                print("number of categories final: \(cat.count)")
                self.category.modelCategory=cat

                //Additional code

            })
        }
}

感谢您的帮助:)

【讨论】:

    【解决方案3】:

    您的代码中的 asynchrony 似乎遇到了问题。

    您的函数在实际运行您的文档的括号中包含的代码之前调用return tabCategory

    使用转义闭包在异步进程完成时调用函数。

    您的成品将如下所示:

    static func getCategoryfromDB(completed: @escaping (([categoryModel]?, Error?)) -> Void) {
    
        let rootCategory = FirestoreReferenceManager.rootEvents
    
        rootCategory.getDocuments() { (querySnapshot, err) in
            if let err = err {
                tabCategory(nil, err)
            } else {
                var tabCategory=[categoryModel]()
                for document in querySnapshot!.documents {
    
                    tabCategory.append(categoryModel(catImg: document.data()["img"] as! String, catName:document.data()["name"] as! String, catID: document.documentID))
    
                    print("number of categories running: \(tabCategory.count)")
                }
              gotData(tabCategory, nil)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多