Firebase用Swift 3计算孩子的数量

时间:2016-06-20 08:53:18

标签: ios swift firebase firebase-realtime-database

我有一个字符串数组,我试图通过firebase填充它。它是一个聊天应用程序,当用户创建一个房间时,他或她为房间命名。当用户登录并进入登录页面时,它会查询他或她正在参与的所有房间,我希望它能填充表格视图。在firebase docs中我发现了childrenCount,但我似乎无法让它工作。这是我到目前为止所尝试的

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    let ref = firebase.child("users").child(fUID).child("participating")

    ref.observe(.value, with: { (snapshot: FIRDataSnapshot!) in
        print(snapshot.childrenCount)
        rooms.count = snapshot.childrenCount
    })

    return rooms.count
}

我收到一个错误,即count是一个get get属性。 如何填充该数组计数?

3 个答案:

答案 0 :(得分:7)

Firebase数据以异步方式加载(和同步)。如果添加一些调试日志记录,这是最容易看到的:

let ref = firebase.child("users").child(fUID).child("participating")

print("Starting observing");
ref.observe(.value, with: { (snapshot: FIRDataSnapshot!) in
    print("Got snapshot");
    print(snapshot.childrenCount)
    rooms.count = snapshot.childrenCount
})

print("Returning count");
return rooms.count

运行此代码段时,日志输出将为:

  

开始观察

     

返回计数

     

快照

这可能不是您期望输出的顺序。它还解释了为什么您的计数永远不会正确:数据尚未加载,因此无法计算。

这就是Firebase侦听器使用回调块的原因:在数据同步时调用该块。

答案 1 :(得分:1)

我想那是"房间"是一个班级的数组。

"一个错误,即count是一个get get属性"当你试图设置阵列的范围时会发生#34;房间" - 你不能这样做。

'计数'属性是只读访问权限。 在人的语言中,就像。你有一个包。你把一个苹果放在袋子里。你把另一个苹果放在袋子里。现在你有2个苹果。你不能只说'#34;我的包里有2个苹果。"

修复它:

  • 您必须创建类型为' Room'每个快照的类:FIRDataSnapshot
  • 将其添加到房间。

示例:

function multiple_add() {
  $table_Id = $this->input->post('tableId[]');

  foreach($table_Id as $tableId) {

    $data_some = array(
    'tableId' => $tableId,
    'blah' => $this->input->post('blah')
    );

    // Insert Data Function Call
    $this->db->insert('TableName', $data_some);
    }
}

}

答案 2 :(得分:0)

我的方法是关闭。当通话完成后,它将返回孩子的数量

typealias countAllPostsResult = (UInt) -> Void
class func countAllPosts(isDeleted: Bool,completedHandler: @escaping countAllPostsResult) {
    print("countAllPosts ...is running...", isDeleted)
    var dataSnapshot = [DataSnapshot]()

    Constants.Commons.posts_node_ref.queryOrdered(byChild: Constants.Posts.is_deleted).queryStarting(atValue: "false").queryEnding(atValue: "false\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) -> Void in

        for snap in snapshot.children {
            dataSnapshot.append(snap as! DataSnapshot)
        }
        if dataSnapshot.count > 0 {
            completedHandler(UInt(dataSnapshot.count))
        } else {
            completedHandler(0)
        }
    })

}