Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase observeSingleEvent完成处理程序_Ios_Swift_Firebase Realtime Database - Fatal编程技术网

Ios Firebase observeSingleEvent完成处理程序

Ios Firebase observeSingleEvent完成处理程序,ios,swift,firebase-realtime-database,Ios,Swift,Firebase Realtime Database,我有一个FirebaseManager类和一个get data函数。 调用此函数时,我需要在调用它的位置获取此数据。 我正在尝试做一些类似的事情 import Firebase class FirebaseManager { var ref = Database.database().reference() func getData (path: String) -> DataSnapshot { self.ref.chil

我有一个FirebaseManager类和一个get data函数。 调用此函数时,我需要在调用它的位置获取此数据。 我正在尝试做一些类似的事情

import Firebase

class FirebaseManager {
    
    var ref = Database.database().reference()
 
    func getData (path: String) -> DataSnapshot {
        
        self.ref.child(path).observeSingleEvent(of: .value) { (snapshot) in
            if snapshot.exists() {
                print(snapshot.value!)
        return snapshot // XCODE ERROR - Cannot convert return expression of type 'Void' to return type 'DataSnapshot'
            } else {
                print("No data by path \(path)")
            }
        }
    }
}

正如标题所示,您需要一个完成处理程序。您可以将其作为参数传递给函数。它可能看起来像这样:

func getData(path: String, completion: @escaping (DataSnapshot) -> Void) {
    self.ref.child(path).observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.exists() {
            completion(snapshot)
        } else {
            print("No data by path \(path)")
        }
    }
}
getData(path: "myPath") { snapshot in
  //do something with snapshot here
}
//no access to snapshot here
然后,你可以这样称呼它:

func getData(path: String, completion: @escaping (DataSnapshot) -> Void) {
    self.ref.child(path).observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.exists() {
            completion(snapshot)
        } else {
            print("No data by path \(path)")
        }
    }
}
getData(path: "myPath") { snapshot in
  //do something with snapshot here
}
//no access to snapshot here
请注意,您可以访问闭包内的
snapshot
{}
),因此在闭包后无法访问快照


就我个人而言,我可能会进行一些重构,以便从快照内部返回实际数据(如
字符串
字典
,等等),而不是返回
DataSnapshot
本身,但这是一个偏好问题。

thnx很多,朋友!很高兴这有帮助。您可以通过单击绿色复选标记将答案标记为正确/接受。