在 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) 几乎符合可选要求