我正在尝试调用异步函数(观察Firebase数据库值)并使用调度组来通知何时已从所述异步函数中提取数据。
这是在我的tableView(_ tableView :, cellForRowAt indexPath :) UITableViewDelegate方法中发生的。首先,我将“单元格”声明为UITableViewCell的自定义子类(在本例中为“ CommentCell”)。然后,我创建调度组,进入该组,从firebase中提取数据,使用所述数据填充我的单元格,然后离开/通知调度组。通知群组后,我只想返回我的单元格。
无论出于什么原因,该函数都在说我没有返回UITableViewCell,即使我的函数只有一条路径可能会失败,并且以CommentCell的返回结尾。该问题很可能是由于以下原因导致的:尝试返回单元格时出现此错误:
“ CommentCell”类型的表达?未使用
这是我的tableView(_ tableView :, cellForRowAt indexPath :)委托方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell: CommentCell!
let group = DispatchGroup()
group.enter()
Database.database().reference().child("Users/\(comments[indexPath.row].uid)").observeSingleEvent(of: .value) { (snapshot) in
let data = snapshot.value as! [String:Any]
cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? CommentCell
cell.parentVC = self
cell.uid = self.comments[indexPath.row].uid
cell.photoUrl = data["photoUrl"] as? String
cell.imageView?.image = UIImage(named: "profile")?.resize(targetSize: CGSize(width: 35, height: 35))
cell.imageView?.layer.cornerRadius = 17.5
self.loadImage(string: cell.photoUrl, cell: cell)
cell.imageView?.clipsToBounds = true
cell.textLabel?.text = data["name"] as? String
cell.textLabel?.font = .boldSystemFont(ofSize: 15)
cell.textLabel?.numberOfLines = 0
cell.detailTextLabel?.textColor = .darkGray
cell.detailTextLabel?.font = .systemFont(ofSize: 14)
cell.detailTextLabel?.text = self.comments[indexPath.row].text
cell.detailTextLabel?.numberOfLines = 0
cell.selectionStyle = .none
group.leave()
}
group.notify(queue: .main) {
return cell
}
}
已附上代码和错误的图片。
答案 0 :(得分:0)
首先,n tableView(_:,cellForRowAt:)
您必须同步返回单元格。为了异步加载数据,请执行以下类似操作:
回到您的代码,您的函数中没有wait()
调用,因此控制流将一直运行到函数的末尾,并且永远不会返回(notify
函数不会块!)。这就是为什么您收到错误消息的原因。