Как исправить замораживание во время обновления обновления элементов коллекции?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить замораживание во время обновления обновления элементов коллекции?

Сообщение Anonymous »

У меня есть UICollectionViewCompositionalLayout. В DidSelectItemAt начинаю загрузку файла. Внутри элементов просмотра коллекции у меня есть метка, показывающая процент загруженного файла. Я использую этот код для этого и для обновления своей ячейки:

Код: Выделить всё

func createDataSource() {
dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { collectionView, indexPath, item in
switch self.sections[indexPath.section].identifier {

case "cell":

let cell = self.configure(DCell.self, with: item, for: indexPath)

if indexPath.row < self.items.count {
let item = self.items[indexPath.row]
switch item.state {
case .downloading: cell.title.text = "\(String(format: "%.f%%", item.progress * 100))"
case .completed: cell.title.text = "Completed"
case .failed: cell.title.text = "Fail"
case .none: break
}
}
return cell

default: return self.configure(DCell.self, with: item, for: indexPath)
}
}
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

// activate the download manager code...
let url = URL(string: "http")!
let downloadManager = DownloadManager()
downloadManager.identifier = indexPath.row+1
downloadManager.collectionId = 0
downloadManager.folderPath = "\(indexPath.row+1)"
let downloadTaskLocal = downloadManager.activate().downloadTask(with: url)
downloadTaskLocal.resume()

// get progress:
downloadManager.onProgress = { [weak self] (row, collection, progress) in
guard let self = self else { return }
DispatchQueue.main.async {
self.items[row - 1].progress = progress
switch progress {
case 1.0: self.items[row - 1].state = .completed
case _: self.items[row - 1].state = .downloading
}
self.reloadItem(indexPath: .init(row: row - 1, section: 0))
}
}

}

func reloadItem(indexPath: IndexPath) {
guard let needReloadItem = dataSource!.itemIdentifier(for: indexPath) else { return }

var snapshot = NSDiffableDataSourceSnapshot()
snapshot.appendSections(sections)
for section in sections { snapshot.appendItems(section.item, toSection: section) }
dataSource?.apply(snapshot)

snapshot.reloadItems([needReloadItem])
dataSource?.apply(snapshot, animatingDifferences: false)
}
код из DownloadManager для отслеживания прогресса:

Код: Выделить всё

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
if totalBytesExpectedToWrite > 0 {
if let onProgress = onProgress { calculateProgress(session: session, completionHandler: onProgress) }
}
}

private func calculateProgress(session : URLSession, completionHandler : @escaping (Int, Int, Float) -> ()) {
session.getTasksWithCompletionHandler { (tasks, uploads, downloads) in
let progress = downloads.map({ (task) -> Float in
if task.countOfBytesExpectedToReceive > 0 { return Float(task.countOfBytesReceived) / Float(task.countOfBytesExpectedToReceive)
} else { return 0.0 }
})
completionHandler(session.getSessionDescription(), Int(session.accessibilityHint!)!, progress.reduce(0.0, +))
}
}
Но когда мой файл загружается, и я использую этот метод ReloadiTem (IndexPath: IndexPath) для обновления ячейки, я получаю немного замораживания при прокрутке сбора и замораживает, если Я снова нажимаю на ячейку, которая в настоящее время показывает прогресс загрузки. Моя проблема находится внутри этого метода ReloadItem (IndexPath: IndexPath) . Но как решить эту проблему с помощью обновления ячейки? зафиксированный. Но если я снова нажимаю на ячейку, которая в настоящее время показывает прогресс загрузки, у меня есть странное поведение. В классе ячейки у меня есть этот код, чтобы показать анимацию: < /p>

Код: Выделить всё

class DCell: UICollectionViewCell, SelfConfiguringCell {

private func animateScale(to scale: CGFloat, duration: TimeInterval) {
UIView.animate( withDuration: duration, delay: 0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.5, options: [], animations: {
self.stackView.transform = .init(scaleX: scale, y: scale)
self.textView.transform = .init(scaleX: scale, y: scale)
}, completion: nil)
}

override func touchesBegan(_ touches: Set, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
animateScale(to: 0.9, duration: 0.4)
}

override func touchesEnded(_ touches: Set, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
animateScale(to: 1, duration: 0.38)
isSelected.toggle()
}

override func touchesCancelled(_ touches: Set, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
animateScale(to: 1, duration: 0.38)
isSelected.toggle()
}

}
< /code>
Но если я снова нажимаю на ячейку, которая в настоящее время показывает прогресс загрузки, мои мобильные палочки. Это становится меньше других. И когда нажимает анимация, не появится. didselectiTemat 
не вызван. Но для других ячеек анимация работает нормально, прежде чем прогресс начнет показывать. Я не понимаю, почему это происходит, и didselectiTemat не называется

Подробнее здесь: https://stackoverflow.com/questions/793 ... tem-update
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»