Swift Firebase UITableViewCell在数据填充单元格可用之前加载

时间:2019-03-19 02:11:48

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

我正在将作为字符串数组的数据推送到tableview控制器。这些字符串是“ uid”,是我数据库中的用户。使用此数组,我调用firebase提取所有用户,然后与uid进行匹配。我得到的数据正确,但是我打印出所有内容以确保何时有数据可用,并且只有在加载表格视图单元格后才可用数据,这导致数据为零,从而导致崩溃或只是空数据。如何先加载数据然后加载单元格,以便可以显示数据?

我已经为数据创建了函数,现在我将其保存在viewDidLoad中。另外,您会看到我尝试将Firebase调用添加到Cell设置中,但是当然不起作用。

字符串数组

var data = [String]() 

viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    Database.database().reference().child("Businesses").observe(.value, with: { snapshot in
        if snapshot.exists() {
            self.businessUID = snapshot.value as? NSDictionary
            if let dict = snapshot.value as? NSDictionary {
                for item in dict {
                    let json = JSON(item.value)
                    let businessUid = json["uid"].stringValue
                    for uid in self.data {
                        if uid == businessUid {
                            let customerValue = self.businessUID?[uid]
                            self.businessDictionary = customerValue as! NSDictionary
                            print(self.businessDictionary)
                            print("Just printed the business dictionary")
                        }
                    }
                }
            }
        } else {
            print("does not exist")
        }
    })
}

Tableview单元格

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

    print(self.businessDictionary)
    print("Print the dictionary here to check the values")
    let businessValues = self.businessDictionary
    let uid = self.data.description

    print(businessValues)
    print("printed the business values")

    if let dict = businessValues {
        for item in dict {
            let json = JSON(item.value)
            let businessUid = json["uid"].stringValue
            for uid in self.data {
                if uid == businessUid {
                    let customerValue = self.businessUID?[uid]
                    self.businessData = customerValue as? NSDictionary
                    print(self.businessData)
                    print("Printing matching the uid values")
                }
            }
        }
    }

    cell.businessName.text = businessData?["businessName"] as? String
    cell.businessStreet.text = businessData?["businessStreet"] as? String
    cell.businessCity.text = businessData?["businessCity"] as? String
    cell.businessState.text = businessData?["businessState"] as? String

    let businessProfilePicture = businessData?["profPicString"] as? String
    if (businessProfilePicture!.characters.count) > 0 {
        let url = URL(string: (businessProfilePicture!))
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: url!)
                DispatchQueue.main.async {
                    let image = UIImage(data: data!)?.potter_circle
                    cell.profileImage.contentMode = UIView.ContentMode.scaleAspectFill
                    cell.profileImage.image = image
                    }
                }
            } else {
        let image = UIImage(named: "default")?.potter_circle
        cell.profileImage.contentMode = UIView.ContentMode.scaleAspectFill
        cell.profileImage.image = image
    }

    return cell
}

1 个答案:

答案 0 :(得分:0)

这是我的解决方案。得到它的工作。附加并使用“ usersArray”来获取和显示数据。

var data = [String]()
var usersArray = [NSDictionary?]()


override func viewDidLoad() {
    super.viewDidLoad()

    Database.database().reference().child("Businesses").observe(.value, with: { snapshot in
        if snapshot.exists() {
            self.businessUID = snapshot.value as? NSDictionary
            if let dict = snapshot.value as? NSDictionary {
                for item in dict {
                    let json = JSON(item.value)
                    let businessUid = json["uid"].stringValue
                    for uid in self.data {
                        if uid == businessUid {
                            let customerValue = self.businessUID?[uid]
                            self.usersArray.append(customerValue as! NSDictionary)
                            self.followUsersTableView.reloadData()
                        }
                    }
                }
            }
        } else {
            print("does not exist")
        }
    })
}


override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

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

    let user : NSDictionary?

    user = self.usersArray[indexPath.row]

    cell.businessName.text = String(user?["businessName"] as! String)
    cell.businessStreet.text = String(user?["businessStreet"] as! String)
    cell.businessCity.text = String(user?["businessCity"] as! String)
    cell.businessState.text = String(user?["businessState"] as! String)

    let businessProfilePicture = String(user?["profPicString"] as! String)
    if (businessProfilePicture.characters.count) > 0 {
        let url = URL(string: (businessProfilePicture))
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: url!)
                DispatchQueue.main.async {
                    let image = UIImage(data: data!)?.potter_circle
                    cell.profileImage.contentMode = UIView.ContentMode.scaleAspectFill
                    cell.profileImage.image = image
                    }
                }
            } else {
        let image = UIImage(named: "default")?.potter_circle
        cell.profileImage.contentMode = UIView.ContentMode.scaleAspectFill
        cell.profileImage.image = image
    }

    return cell
}