【问题标题】:Swift executing firebase calls out of orderSwift 乱序执行 firebase 调用
【发布时间】:2019-02-19 21:17:51
【问题描述】:

我的代码调用了我的 firebase 数据库,但就函数调用而言,它接收数据的顺序不正确。它从 ref3 然后 ref2 然后 ref4 调用数据,我当然希望它按 ref2、ref3、ref4 的顺序检索数据。不管怎样,它总是按这个顺序做。

     var ref2: DatabaseReference?
     var ref3: DatabaseReference?
     var ref4: DatabaseReference?


     ref2 = Database.database().reference().child("User data").
     ref3 = Database.database().reference().child("User Info").child("Name")
     ref4 = Database.database().reference().child("User Info").child("Address")





    ref2?.observe(DataEventType.value, with:{(DataSnapshot) in
        if DataSnapshot.childrenCount > 0{
            for data in DataSnapshot.children.allObjects as![DataSnapshot]{
                let proObj = data.value as? [String: AnyObject]
                let p: String = proObj?["Username"] as! String
                let n: String = proObj?["User login"] as! String


            }

        }
    })

    ref3?.observe(DataEventType.value, with:{(DataSnapshot) in
        if DataSnapshot.childrenCount > 0{
            for data in DataSnapshot.children.allObjects as![DataSnapshot]{
                let proObj = data.value as? [String: AnyObject]
                let p: String = proObj?["User first name"] as! String
                let n: String = proObj?["User last name"] as! String


            }

        }
    })

    ref4?.observe(DataEventType.value, with:{(DataSnapshot) in
        if DataSnapshot.childrenCount > 0{
            for data in DataSnapshot.children.allObjects as![DataSnapshot]{
                let proObj = data.value as? [String: AnyObject]
                let p: String = proObj?["User email"] as! String



            }

        }
    })

【问题讨论】:

    标签: ios swift database xcode firebase


    【解决方案1】:

    从您的 firebase 数据库查询数据时,您正在执行 异步 调用。简而言之,您的代码在不同的线程上执行,然后执行并行操作。这正是您的情况。

    您正在观察来自三个不同引用的数据,即使您以编程方式定义了它们的顺序,也无法保证您的观察者的完成处理程序块中的代码将以完全相同的顺序运行。

    如果你想按顺序运行它们,那么你必须嵌套你的观察者,这样下一个数据库查询只有在前一个查询完成后才会执行。

    下面的假设应该有效

    ref2?.observe(DataEventType.value, with: { (DataSnapshot) in
    
        if DataSnapshot.childrenCount > 0 {
            for data in DataSnapshot.children.allObjects as! [DataSnapshot] {
                let proObj = data.value as? [String: AnyObject]
                let p: String = proObj?["Username"] as! String
                let n: String = proObj?["User login"] as! String
            }
        }
    
        ref3?.observe(DataEventType.value, with: { (DataSnapshot) in
    
            if DataSnapshot.childrenCount > 0 {
                for data in DataSnapshot.children.allObjects as! [DataSnapshot] {
                    let proObj = data.value as? [String: AnyObject]
                    let p: String = proObj?["User first name"] as! String
                    let n: String = proObj?["User last name"] as! String
                }
            }
    
            ref4?.observe(DataEventType.value, with: { (DataSnapshot) in
    
                if DataSnapshot.childrenCount > 0 {
                    for data in DataSnapshot.children.allObjects as![DataSnapshot] {
                        let proObj = data.value as? [String: AnyObject]
                        let p: String = proObj?["User email"] as! String
                    }
                }
    
            }) // ref4 observer
    
        }) // ref3 observer
    
    }) // ref2 observer
    

    【讨论】:

    • 非常感谢它的工作!我也非常感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多