Использование группы диспетчеризации в tableView (_ tableView :, cellForRowAt indexPath :) метод делегата; «Выражение типа UITableViewCell не используется» - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь вызвать асинхронную функцию (наблюдая за значением базы данных Firebase) и использую группу диспетчеризации для уведомления, когда данные извлекаются из указанной асинхронной функции.

Это происходит в моем tableView (_tableView :, cellForRowAt indexPath :) Метод UITableViewDelegate.Сначала я объявляю «ячейку» как пользовательский подкласс UITableViewCell (в данном случае «CommentCell»).Затем я создаю группу рассылки, захожу в группу, извлекаю данные из базы данных, использую эти данные для заполнения своей ячейки, а затем покидаю / уведомляю группу рассылки.Когда группа получает уведомление, я просто хочу вернуть свою ячейку.

По какой-то причине функция говорит, что я не возвращаю 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 голосов
/ 04 апреля 2019

Прежде всего, n tableView(_:,cellForRowAt:) вы должны вернуть ячейку синхронно. Чтобы загрузить данные асинхронно, сделайте что-то похожее на следующее:

  • настроить пользовательскую ячейку, которая отображает заполнитель или индикатор загрузки. Верните эту ячейку синхронно. Одновременно начните загрузку контента.
  • как только контент станет доступен, обновите ячейку

Возвращаясь к вашему коду, в вашей функции нет вызова wait(), следовательно, поток управления просто запускается до конца функции и никогда не возвращается после возврата (функция notify не блокируется!). Вот почему вы получаете сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...