swift UITableViewController с UIImagView Загрузка данных через HTTP - PullRequest
0 голосов
/ 24 октября 2019

Я создаю список песен. Я использую UITableViewController, я загружаю JSON, анализирую его, а затем показываю его, проблем нет. Затем я хочу загрузить изображение обложки через http для своих ячеек, у меня нет проблем с его реализацией. Моя проблема в том, что, если я прокручиваю слишком быстро до дна (там около 300 песен), я вижу, что UIImageView циклически переключается на все изображения, которые он должен был загрузить. Что логично, так как они используются повторно, и я никогда не останавливал их от загрузки. Мой код выглядит следующим образом:

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlaylistItem", for: indexPath) as! PlaylistItemCell
    let song = self.playlistViewModel!.songs[indexPath.row]

    cell.artistLabel?.text = song.artist
    cell.titleLabel?.text = song.title

    let url = URL(string: "https://mydomain.dom/api/songs/images/" + song.id + "/a/6400/")

    cell.coverImage.image = imageCache[url!.absoluteString]
    if cell.coverImage.image == nil {
      getSongCover(url:url!) { (success, image) in
        imageCache[url!.absoluteString] = image
        DispatchQueue.main.async {
          cell.coverImage.image = image
        }
      }
    }

    return cell
  }

Итак, в основном, у меня есть кэш изображений:

  var imageCache: [String: UIImage] = [:]

Я пытаюсь загрузить свой UIImageView изображением из него, если это не таксуществует, я загружаю его, а затем подаю его в UIImageView. Я понимаю, что при повторном использовании ячеек изображения загружаются и отображаются последовательно в последнем «использовании» ячейки. Но как я могу избежать этого?

1 Ответ

0 голосов
/ 24 октября 2019

Вместо непосредственного обновления ячейки используйте замыкание для передачи изображения и уникального идентификатора ячейки (song.id?) Обратно методу в viewController.

Этот метод может затем обновить кэш, проверить, находится ли ячейка с уникальным идентификатором в массиве tableView.visibleCells, и, если это так, обновить его непосредственно с изображением (все еще через GCD, чтобы получить его восновная тема).

Это должно остановить отображение случайных изображений, а также улучшить производительность приложения, так как он будет пытаться обновить пользовательский интерфейс только изображениями для видимых ячеек, а не для всех.

Я бы тожеизображение заполнителя, которое будет отображаться, когда правильная обложка недоступна (если вы этого еще не сделали), поскольку она будет выглядеть более согласованно, особенно если у вас есть доступ к сети или отключение серверной части.

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