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

Posted

技术标签:

【中文标题】在 tableView(_ tableView:, cellForRowAt indexPath:) 委托方法中使用调度组; “未使用 UITableViewCell 类型的表达式”【英文标题】:Using dispatch group in tableView(_ tableView:, cellForRowAt indexPath:) delegate method; "Expression of type UITableViewCell is unused" 【发布时间】:2019-04-03 21:34:44 【问题描述】:

我正在尝试调用异步函数(观察 Firebase 数据库值)并使用调度组在从所述异步函数中提取数据时发出通知。

这发生在我的 tableView(_ tableView:, cellForRowAt indexPath:) UITableViewDelegate 方法中。我首先将“cell”声明为 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
    

附件是代码和错误的图像。

【问题讨论】:

您不能尝试异步返回单元格。那是行不通的。 请先搜索再询问。如何用下载的数据填充表格的问题已经在这里讨论过很多次了。 【参考方案1】:

首先,在tableView(_:,cellForRowAt:)必须同步/立即返回单元格。这不是您可以等待从网络或文件系统加载内容的地方,因为这会阻塞 UI。要异步加载数据,请执行以下类似操作:

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

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

【讨论】:

以上是关于在 tableView(_ tableView:, cellForRowAt indexPath:) 委托方法中使用调度组; “未使用 UITableViewCell 类型的表达式”的主要内容,如果未能解决你的问题,请参考以下文章

tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 没有被调用

如何避免 tableView(_:cellForRowAt) 中的崩溃?

TableView _:didSelectRowAt: 仅在滑动触摸时触发

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) 几乎符合可选要求

iOS UI08_TableView界面传值

在 tableView 上添加视图