Отслеживание прогресса загрузки в UICollectionView дублирует ячейки - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть следующие настройки:

  • UploadedCell
  • DisplayUploadsV C
  • UploadHelper с делегатом, который отслеживает прогресс (это одиночный код)

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

В своей ячейке я использую prepareForReuse и задаю для своей загрузки значение nil.

Но опять же, когда я прокручиваю и я использую ячейки, я вижу двойные ячейки. Я также вижу, когда я вытягиваюToRefress или go до конца результатов, чтобы получить больше результатов с сервера.

Просто не уверен, что мне не хватает, или я могу использовать этот вид реализации с таймером в ячейке представления коллекции, чтобы получить прогресс.

UploadedCell

class UploadedCell: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout  {

// MARK: Variables declaration

let uploadBadge = UIImageView(image: #imageLiteral(resourceName: "uploads") , contentMode: .scaleAspectFit)
let uploadName = UILabel(font: UIFont.openSansSemiboldFontOfSize(18))
let statusName = UILabel(font: UIFont.openSansSemiboldFontOfSize(18))
@objc lazy var moreButton: UIButton = {
    let button = UIButton()
    button.setImage(UIImage(named: "dots-menu")?.withRenderingMode(.alwaysTemplate), for: .normal)
    button.tintColor = .lightGray
    button.addTarget(self, action: #selector(handleMore), for: .touchDown)
    return button
}()


// MARK - didSet

var upload: UploadModel.UploadItem? {
    didSet {

        uploadName.text = upload?.title
        statusName.text = upload?.status
    }
}

// MARK: - Main Init

override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = .white

    setupViews()
}

override func prepareForReuse() {
    self.upload = nil
    super.prepareForReuse()
}
}

DisplayUploadsV C

class DisplayUploadsVC: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    // MARK: - Properties     

    /// various object init
    var uploadCell: UploadCell = UploadCell()
    var uploadProgress = (progress: Float(0), uploadId: "")
    var progressTimer = Timer()

override func viewDidLoad() {
        super.viewDidLoad()

        UploadHelper.shared.uploadHelperDelegate = self    

        setupViews()
        setupEmptyBackgroundView()
        fetchUploads()
    }

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UploadCell
        cell.upload = nil

        var upload = isSearching ? filteredResults[indexPath.item] : results?[indexPath.item]

        cell.upload = upload

        // get uploads with paging if we are paginating


        if (self.uploadProgress.uploadId == upload?.id && self.uploadProgress.progress < 99) {
            progressTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
                    upload?.status = String(format: NSLocalizedString("Uploading %.0f%%", comment: ""), self.uploadProgress.progress)
                    cell.upload = upload

                if self.uploadProgress.progress > 99.9 {
                    self.progressTimer.invalidate() 
                    upload?.status = NSLocalizedString("Upload DONE", comment: "")
                    cell.upload = upload                    
                }
            }
        }

        return cell
    }
extension DisplayUploadsVC : UploadHelperProgress {

    func showProgress(progress: Float, uploadId: String) {
        self.uploadProgress.progress = progress
        self.uploadProgress.uploadId = uploadId
    }
}

UploadHelper

protocol UploadHelperProgress : class {
    func showProgress(progress: Float, uploadId: String)
}    

private var id: String?    
private let progressBlock = { bytesWritten, bytesTotal in


        var progress = Float(bytesWritten) / Float(bytesTotal)
        UploadHelper.shared.uploadHelperDelegate?.showProgress(progress: progress * 100, uploadId: id ?? "")        

    } as UploadProgressBlock

class UploadHelper: NSObject {

    /// delegate
    weak var uploadHelperDelegate: UploadHelperProgress?  

    /// singleton
    static let shared = UploadHelper()

    func upload(fileUrl: URL, fileUploadUrl: String, uploadId: String) {


        id = uploadId
        //
        // upload logic
        //

        upload?.progressBlock = progressBlock
        upload?.resume()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...