Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

swift: Загрузка нескольких файлов

Нужно скачать 10 файлов с показом прогресса загрузки для всех 10 файлов после нажатия на любую ячейку таблицы. Каждой ячейке соответствует свой файл( cell1 - file1, cell2 - file2 и т.д ). Все 10 файлов загружаются нормально. Проблема в том, что прогресс загрузки отображается только в нажатой ячейке для одного файла. А нужно чтобы прогресс отображался во всех ячейка для соответствующих им файлов. Как это сделать?
Этот код использую для загрузки файлов:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
for index in 1...10 { let url = URL(string: "link\(index)")! let downloadTasks = backgroundSession.downloadTask(with: url) downloadTasks.resume()
let progressView = progressViews(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(24), height: CGFloat(24))) let cell = tableView.cellForRow(at: indexPath) cell?.accessoryView = progressViews progressView.startprogressView() }}


Ответ

В принципе у Вас уже всё готово для решения поставленной Вами задачи, Вы лишь забываете правильно указать ячейку, у которой надо показывать загрузку. Кроме этого, самым лучшим вариантом для Вас будет сохранять индексы необходимых ячеек в какую-нибудь переменную, а зачем при перерисовке из неё извлекать значения (если бы у Вас гарантированно все элементы всегда были бы видимы, то можно было бы решить все проблемы проще). Итак, создаёте такое член-данное у себя в классе:
private var cellsIndexesForLoaing = [Int]()
При нажатии на ячейку инициализируйте данную переменную нужным диапазоном:
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.cellsIndexesForLoaing = [Int](0..<10) self.table.reloadData() // И не забудьте обновить саму таблицу }
Затем при перерисовке каждой ячейки проверяйте, надо ли начинать загрузку соответствующего файла:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = table.dequeueReusableCell(withIdentifier: "Идентификатор Вашей ячейки", for: indexPath) let indexOfCell = self.cellsIndexesForLoaing.index(of: indexPath.row) if (indexOfCell != nil) { // Если текущая ячейка попала в диапазон, то начинаем загрузку
loadFileWithProgress(index: indexPath.row, cell: cell) // Функция для загрузки файлов self.cellsIndexesForLoaing.remove(at: indexOfCell!) // Если мы начали загрузку, то текущую ячейку можно смело удалять из диапазона } else {
//Так как ячейки таблицы кешируются и повторно используются, то Вам нужно ещё и вернуть ячейку к первоначальному состоянию (например, просто удалить её accessoryView, а можете ещё и загрузку прервать) cell.accessoryView = nil } return cell }
Функция для загрузки файла может выглядеть так:
func loadFileWithProgress(index:Int, cell:UITableViewCell) {
let url = URL(string: "link\(index)")! //let downloadTasks = backgroundSession.downloadTask(with: url) //downloadTasks.resume()
let progressView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 20, height: 20)) //let cell = tableView.cellForRow(at: indexPath) progressView.backgroundColor = UIColor.black cell.accessoryView = progressView //progressView.startprogressView() }
В ней я закомментировал всё лишнее и ради примера устанавливаю в качестве accessoryView обычный чёрный прямоугольник.
Весь код в ответе написан на Swift 3.3.

Комментариев нет:

Отправить комментарий