在tableView(_ tableView :, cellForRowAt indexPath :)委托方法中使用调度组; “未使用类型UITableViewCell的表达式”

时间:2019-04-03 21:34:45

标签: ios swift uitableview uikit

我正在尝试调用异步函数(观察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
    }
}

已附上代码和错误的图片。

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,n tableView(_:,cellForRowAt:)必须同步返回单元格。为了异步加载数据,请执行以下类似操作:

  • 设置一个自定义单元格,该单元格显示一个占位符或一个加载指示器。返回此单元同步。同时,开始加载内容。
  • 一旦内容可用,请更新单元格

回到您的代码,您的函数中没有wait()调用,因此控制流将一直运行到函数的末尾,并且永远不会返回(notify函数不会块!)。这就是为什么您收到错误消息的原因。