Асинхронная загрузка ячеек UITableView с помощью RxSwift

Я пытаюсь использовать RxSwift в своем приложении. Один из вариантов использования - это асинхронная загрузка изображения UITableView, которая запускается кнопкой поиска (или перезапуском ячейки). Что я не могу заставить работать хорошо, так это отбрасывать предыдущие результаты.

Для меня важно соблюдать правильный порядок загрузки, а также иметь возможность отклонять сетевые запросы на ненужные изображения.

Я работаю над RxSwift, но это может относиться к RxJava и Android RecyclerView.

Псевдокод текущего состояния:

myModel
  .searchString
  .debounce(0.3)
  .distinctUntilChanged()
  .flatMapLatest({ return fetchImageUrlsFromNetwork($0) })
  .bindTo(tableView.rx.items) { (url,cell,...) in
     reactivelyLoadUrl(url)
        .subscribe({ cell.imageView.image = UIImage(data:$0) })
  }

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

но я не уверен, как использовать привязки RxCocoa для UITableView с комбинацией асинхронной загрузки ячейки. Тот факт, что внутренняя часть tableview использует нагрузку при прокрутке и повторном использовании ячеек, также добавляет этому сценарию некоторые сложности.

Также важно, чтобы мне не пришлось заранее загружать все данные tableview и, следовательно, отображать все изображения ячеек одновременно.

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

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


person Shahar    schedule 03.04.2017    source источник


Ответы (1)


RxSwift может помочь вам решить множество сложных проблем. Лично я считаю, что это не так. Мне кажется, что загрузка результатов из модели в табличное представление тривиальна и понятна при использовании Rx. Чтобы вернуть связанные данные для этого tableView, хотя после этого нет.

Я бы подумал об использовании библиотеки, такой как KingFisher / SDWebImage, для решения этой вторичной проблемы.

person Evan Anger    schedule 21.06.2017