如何保存和获取嵌套集合中的文档? (正在等待交易)

时间:2018-08-02 21:52:14

标签: swift google-cloud-firestore

编辑:今天,我找到了实现解决方案的时间..实际上,我得到的数据还不错,但是我把它扔掉了。这是一个相当愚蠢的异步错误,我从没会在javascript中出现。所有这些调用都立即发生,但异步返回。为了保留数据,我现在正在使用这种形式(可能是更好的形式?但是我敢肯定,我无法避免在这里进行多个Firebase调用,因此没有最漂亮的解决方案可用):

    var newAppsData:[(String, [AppData])] = []

    var tx = 0
    apps.forEach { app in
        tx = tx + 1

        let URI = "\(DataModel.constants.URIappCollection)/\(app)/tx"
        DBIFirebase.db.collection(URI).getDocuments() { (snapshot, error) in
//...
            tx = tx - 1
            if tx == 0 {
                if newAppsData.count == 0 { /* keep the data! */

原始

我将时间序列数据保存在正在使用的每个“应用”下的集合中,其中的文档带有时间戳:

let docRef = DBIFirebase.db.document("\(DataModel.constants.URIappCollection)/\(app)/tx/\(dateString)")
            docRef.setData(saveable) { (error) in

结果看起来正确,现在在Firestore数据库浏览器中,我看到sampleData/appName/tx/dateStringscreenshot

所以我想我应该以类似的方式来检索它们:

    apps.forEach { app in
        let URI = "\(DataModel.constants.URIappCollection)/\(app)/tx"
        DBIFirebase.db.collection(URI).getDocuments() { (snapshot, error) in
            if let error = error {
                print("Firestore error loading data for app \(app) - \(error.localizedDescription)")
                return
            }

            var appData: [AppData] = []

            guard let documents = snapshot?.documents else {
                print("no documents for app \(app)")
                return
            }

            for document in documents {
                let data = document.data()
                //...
    }

    if appsData.count == 0 { // it always is, we do reach this

我很惊讶地发现调试器中从未到达if let error = error(但是紧接在它之前的行)。当getDocuments完成时,控制台中什么都没有出现。.没有firebase或任何其他错误。

实际上,“使用情况”日志显示今天已发生读取操作。我只是没有看到结果。

可能是什么问题?

修改

  1. .getDocuments { (snapshot, error)原来是错误的,更改为.getDocuments() { (snapshot, error)-我真的很希望,但是结果没有什么不同

1 个答案:

答案 0 :(得分:0)

今天我找到了实现解决方案的时间..实际上,我得到的数据还不错,但是我把它扔掉了。所有这些调用都立即发生,但异步返回。为了保留数据,我现在正在使用这种形式(可能是更好的形式?但是我敢肯定,我无法避免在这里进行多个Firebase调用,因此没有最漂亮的解决方案可用):

    var newAppsData:[(String, [AppData])] = []

    var tx = 0
    apps.forEach { app in
        tx = tx + 1

        let URI = "\(DataModel.constants.URIappCollection)/\(app)/tx"
        DBIFirebase.db.collection(URI).getDocuments() { (snapshot, error) in
//...
            tx = tx - 1
            if tx == 0 {
                if newAppsData.count == 0 { /* keep the data! */