Swift:如何为从 Firebase 数据库获取数据的函数实现完成处理程序

标签 swift firebase firebase-realtime-database completionhandler

我已经编写了代码来从我的 Firebase 数据库检索数据并将其附加到名为 toWatchMoviesListInitial 的数组中。但是,在打印出 toWatchMoviesListInitial 的值后附加数据后,它什么也不打印。
有人告诉我这是因为这是异步的。为了处理这个问题,可以使用完成处理程序。
但是,我是 swift 的新手,我不知道如何实现完成处理程序。如果您能告诉我如何去做,我将不胜感激。这是我的代码:

func initialiseTicketsList() {
    ref = Database.database().reference()
    let uid = Auth.auth().currentUser?.uid
    ref?.child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let userDict = dictionary["watchList"] as? [String:String]
            for (_,myValue) in userDict! {
                if myValue.contains("ignore"){
                }
                else{
                    print(type(of: myValue))
                    self.toWatchMoviesListInitial.append(myValue)
                }
            }
        }
    }, withCancel: nil)

    print(toWatchMoviesList)     //prints empty when it shouldn't
}

最佳答案

func initialiseTicketsList(completionHandler: @escaping ([String]) -> Void) {
    ref = Database.database().reference()
    let uid = Auth.auth().currentUser?.uid
    ref?.child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let userDict = dictionary["watchList"] as? [String:String]
            var toWatchMoviesListInitial: [String] = [] //local variable
            for (_,myValue) in userDict! {
                if myValue.contains("ignore"){
                }
                else{
                    print(type(of: myValue))
                    toWatchMoviesListInitial.append(myValue)
                }
            }
            completionHandler(toWatchMoviesListInitial) // callback invoked.
        }
    }, withCancel: nil)
}

// wherever you call initialiseTicketsList, call with completionHandler
initialiseTicketsList(completionHandler: {movieList in
 self.toWatchMoviesList = movieList // or append based on your usecase.
}

请阅读 here 上有关 closure@escaping 的内容

关于Swift:如何为从 Firebase 数据库获取数据的函数实现完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50458848/

相关文章:

swift - autoLayout 不适合我所有的屏幕尺寸

swift - 如何通过标题快速旋转标记?

ios - 使用 Firebase 实现推送通知的最佳方式

ios - 我可以在查询 FDatasnapshot 后对其进行操作吗?

firebase - 隔离和管理由登录用户完成的集合CRUD-Firebase和Flutter

java - 根据 Firebase 的最新日期将数据排序到 RecyclerView

swift - CLLocationManager.authorizationStatus() 总是 CLAuthorizationStatus.NotDetermined with swift&objC app

javascript - 表的 Firebase child_changed

c# - 无法通过 Unity 将数据写入 Firebase 数据库

ios - 处理 Realm 事务