Я пытаюсь использовать 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
и, следовательно, загрузка сохранит порядок на ячейку, но это не так элегантно.
В результате, если я быстро выполняю несколько поисковых запросов, я могу видеть, что предыдущие загрузки изображений иногда перекрывают новые.