firebase数据后无法返回行数

时间:2018-02-17 14:20:51

标签: ios swift firebase firebase-realtime-database tableview

我正在尝试在tableView中显示不同的数据,具体取决于登录的用户类型。如果typeOfUser设置为admin,则应显示某些数据。如果是其他任何东西,它应该显示其他东西。

我在Unexpected non-void return value in void function内的返回行上收到错误if typeOfUser == "admin"

这是我的代码:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        if Auth.auth().currentUser != nil {
            let user = Auth.auth().currentUser!
            ref.child("users").child(user.uid).observeSingleEvent(of: .value, with: { (snapshot) in
                // Get user value
                let value = snapshot.value as? NSDictionary
                let typeOfUser = value?["typeOfUser"] as? String ?? ""

                if typeOfUser == "admin" {
                    return self.loggedInAdminsMenu.count // ERROR HERE
                } else {
                    return self.loggedInMenu.count // ERROR HERE
                }

            }) { (error) in
                print(error.localizedDescription)
            }

        } else {
            return notLoggedInMenu.count
        }

    }

2 个答案:

答案 0 :(得分:1)

在你的情况下,你没有从函数返回,你从闭包observeSingleEvent返回,这是一个void函数。相反,您可以在viewDidLoad中执行代码,而不是返回,您可以将值分配给变量并调用tableView.reloadData()。不要忘记更改numberOfRows(inSection:)函数以返回这个新创建的变量。

答案 1 :(得分:1)

另一种方法是在视图中调用带有闭包的函数,然后加载,返回相应的菜单计数。然后重新加载表视图。这种方式更强清洁可重复使用

功能

private func getMenuCountByUser(completion: @escaping (Int) ->() ) {
//your code of getting type of user
if Auth.auth().currentUser != nil {
  let user = Auth.auth().currentUser!
  ref.child("users").child(user.uid).observeSingleEvent(of: .value, with: { (snapshot) in
    // Get user value
    let value = snapshot.value as? NSDictionary
    let typeOfUser = value?["typeOfUser"] as? String ?? ""

    if typeOfUser == "admin" {

      //return self.loggedInAdminsMenu.count // Change HERE
      completion(self.loggedInAdminsMenu.count)
    } else {
      //return self.loggedInMenu.count // Change HERE
      completion( return self.loggedInMenu.count)
    }

  }) { (error) in
    print(error.localizedDescription)
  }

然后在 viewDidLoad

getMenuCountByUser { (menuCountFromClosue) in
  //reload tableView
  self.menuCount = menuCountFromClosue
  tableView.reloadData()
}

注意:self。 menuCount 是一个变量,它将被赋予表视图numberOfRowsInASection

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

希望有所帮助