ios - 使用完成处理程序 IOS 从 Firebase 中的 child 获取初始键值

标签 ios firebase firebase-realtime-database completionhandler

我想从 Firebase 中先前设置的数据列表中获取键的数量,然后是键值。我正在尝试完全理解完成处理程序,但我可能还没有做到。为什么这会返回一个空数组?或者至少在下一个函数(在此代码之外)运行之前不填充数据?谢谢!

//Initial data download from Firebase
func getKeys(completion: @escaping () -> Void) {

    Database.database().reference().child("food").observe(.value) { (snapshot) in

            //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            self.onloadKeyArray.append(key)
        }

      }

    completion()
}

最佳答案

现在,完成调用在数据库调用的闭包之外,因此它会在数据返回之前立即被调用。如果将其移入闭包中,您将能够在需要时访问信息。这blog post I wrote可能有助于您更好地了解处理闭包。

func getKeys(completion: @escaping () -> Void) {
    Database.database().reference().child("food").observe(.value) { (snapshot) in

        //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            self.onloadKeyArray.append(key)
        }
        completion()
      }
}

此外,如果您需要闭包之外的这些数据,最好将它传递给完成处理程序,如下所示:

func getKeys(completion: @escaping ([String]) -> Void) {

    keyArray = [String]()
    Database.database().reference().child("food").observe(.value) { (snapshot) in

        //Get count of how many child "apples"
        Let childApplesCount = Int(snapshot.childrenCount)

        //Get each key
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let key = snap.key
            print("keys in snapshot: \(key)")

            //Append to an array of keys for later use
            keyArray.append(key)
        }
        completion(keyArray)
      }
}

然后当您调用该函数时,您将获得数组。这使您能够将数据功能与 View Controller 分开。

yourClass.getKeys() { keyArray in
   self.keys = keyArray
}

关于ios - 使用完成处理程序 IOS 从 Firebase 中的 child 获取初始键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52728576/

相关文章:

ios - 模拟器无法升级 xcode 10?

ios - adMob iOS 恢复(返回应用程序按钮)

Java Android - 如何调用 onSuccess 方法

ios - 检查 firebase 持久数据

android - 如何在 openfire XMPP 中启用/禁用 LastSeen

javascript - jspdf无法在移动设备(android/iPhone)中生成pdf

Android Firebase 远程配置 : Application name is not set. 调用 Builder#setApplicationName

python - 如何使用 Python 向 Firebase 进行身份验证?

firebase - AngularFire2 在数组中嵌套 *ngFor 数组...但 Firebase 没有数组...?

firebase - Google Cloud Functions - 警告避免嵌套 promise promise /无嵌套