Swift和Firebase查询数据库

时间:2016-06-20 08:48:32

标签: swift firebase firebase-realtime-database

我正在尝试创建一个用户所属聊天的tableView。我在他们的网站上关注了firebase教程,他们说很容易得到一个聊天室列表,用户是创建孩子的一部分,并为那个孩子添加房间的名称。

所以我的结构看起来像这样

Users
    UNIQUE KEY
        nickname: "name"
        rooms
            name: true
Room
etc etc

所以在我的cellForRow中我使用了这段代码

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    firebase.child("users").child(fUID).observeSingleEvent(of: .value, with: { snapshot in
        for user in snapshot.children.allObjects as! [FIRDataSnapshot]{
            self.names = (user.value?["participating"] as? String)!
        }
    })

    cell.textLabel?.text = self.names
    cell.detailTextLabel?.text = "test"

    return cell
}

我收到错误,当我给PO命名时,它会出现一个空字符串

有人可以帮我理解错误以及如何解决问题吗?谢谢

编辑1

我已经让代码部分工作

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

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

    ref.observeSingleEvent(of: .value, with: { snapshot in

        print(snapshot.value)

        var dict = [String: Bool]()

        dict = snapshot.value as! Dictionary

        for (key, _) in dict {
            self.names = key
            print(self.names)
        }

        self.rooms.append(self.names)
        self.tableView.reloadData()
    })
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.rooms.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = self.rooms[indexPath.row]

    cell.detailTextLabel?.text = "test"

    return cell
}

现在的问题是firebase中有2个项目......它只显示其中一个

1 个答案:

答案 0 :(得分:2)

您正在使用的代码是挑战。这是一个简化版本:

let usersRef = firebase.child("users")
let thisUser = usersRef.childByAppendingPath(fUID)
let thisUsersRooms = thisUser.childByAppendingPath("rooms")

thisUsersRooms.observeSingleEventOfType(.Value, withBlock: { snapshot in

     if ( snapshot.value is NSNull ) {
          print("not found")
     } else {
          for child in snapshot.children {
               let roomName = child.key as String
               print(roomName) //prints each room name
               self.roomsArray.append(roomName)
          }

          self.myRoomsTableView.reloadData()
     }
})

话虽这么说,应该从viewDidLoad中调用此代码来填充数组,然后在刷新tableView时,应该从该数组中提取数据以填充您的cellView。