Показать прогресс загрузки файла в ячейке таблицы Swift 4 - PullRequest
0 голосов
/ 25 сентября 2018

Я выбираю файлы из iCloud и загружаю их в AWS S3.Я перечисляю выбранные файлы со статусом загрузки индикатора выполнения в ячейке таблицы.Каждая ячейка имеет отдельный заголовок файла и процесс загрузки, который я поддерживаю.Здесь все почти готово, но если я загружаю два файла, то в tableview первая ячейка зависла, а вторая - в процессе загрузки.

Моя функция загрузки

private func upload(file url: URL, keyname : String, exten: String) {
    let bucket = S3BucketName
    let key = keyname
    let contentType = "text/\(exten)"
    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = progressBlock

    let task = transferUtility.uploadFile(url,
                                          bucket: bucket,
                                          key: key,
                                          contentType: contentType,
                                          expression: expression,
                                          completionHandler: completionHandler)
    task.continueWith { (task) -> Any? in
        if let error = task.error {
            DispatchQueue.main.async {
                //self.infoLabel.text = "Error: \(error.localizedDescription)"
            }
            return nil
        }
        if let uploadTask = task.result {
            self.uploadTask = uploadTask
            DispatchQueue.main.async {

                //self.infoLabel.text = "Generating Upload File"

                //self.uploadRequests.append(self.uploadTask)
                self.tableView_util.reloadData()
            }
        }
        return nil
    }
}

Ячейка Tableview

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cellutil", for: indexPath) as! UtilityTableViewCell
        let item = tableArray[indexPath.row]
        cell.name_label_util.text = item.title
        cell.control_button_util.tag  = indexPath.row
        cell.control_button_util.addTarget(self, action: #selector(playpause), for: .touchUpInside)

        // MARK - Upload process
        progressBlock = { [weak self] task, progress in
            guard let strongSelf = self else { return }
            DispatchQueue.main.async {

                cell.loader_Line_util.progress = Float(progress.fractionCompleted)

                //NSLog(@"fraction completed: %f", progress.fractionCompleted);
                let percentageUploaded:Float = Float(progress.fractionCompleted) * 100
                cell.statusLabel_util.text! = NSString(format:"Uploading: %.0f%%",percentageUploaded) as String

                // Need to change
                if cell.statusLabel_util.text == "Uploading: 100%" {
                   cell.statusLabel_util.text = "File Successfully Uploaded!"
                    cell.loader_Line_util.progress = 1;
                    self?.tableView_util.reloadData()

                }
            }
        }

        completionHandler = { [weak self] task, error in
            guard let strongSelf = self else { return }
            if let error = error {
                DispatchQueue.main.async {
                }
                return
            }

1 Ответ

0 голосов
/ 25 сентября 2018

Хорошо, мне пришлось взглянуть на AWS TransferUtility, никогда не использовал его раньше.Я думаю, что вам нужно будет изменить некоторые вещи.Я написал это в блокноте, так что, скорее всего, синтаксические ошибки, и я оставил некоторые функции пустыми, так как вы можете добавить то, что там происходит.

//create a class to track all your uploads in progress
Class UploadTaskTracker {

    let shared = uploadTaskTracker()

    private var tasks = [UploadTask]()

    func addTask( _ task: UploadTask){
        tasks.append(task)
    }

    fund updateTask( id: String, progress: Double){
        // get task from array and update progress value
    }

    func completeTask(id: String) {
        // remove task from tasks array
        // send out a notification to trigger tableview to reload data
    }

    func activeTasks() -> Int {
        return tasks.count
    }

    func taskAt(_ indexPath: IndexPath) -> UploadTask{
        // check for out of bounds 
        // return task
    }
    }

Class UploadTask {

    var id : String
    var progress : Double

}



// and when you start an upload task, change your expression progress block
// (and remove it from the cell.  This should all be happening in another 
// class and not be associated with your tableview 

let guid = UUID()
let uploadTask = UploadTask.init(id: guid, progress: 0.0)
UploadTaskTracker.shared.addTask(uploadTask_

expression.progressBlock = {(task, progress) in

    UploadTaskTracker.shared.updateTask(id: guid, progress: progress)
 }



// then in table view controller
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return UploadTaskTracker.shared.activeTasks()
    }

//And then in 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // dequeue custom uitableviewcel
    let uploadTask = UploadTaskTracker.shared. taskAt( indexPath)
    cell.load(uploadTask)

}

// create a custom uitableviewcell class
class customCell: UITableViewCell {

    @IBOutlet weak var someLabel: UILabel!
    var observers = [NSKeyValueObservation]()

    override func prepareForReuse() {
        // clear previous UI to reduce chance of user seeing obsolete text or image
        super.prepareForReuse()
        stopObservers()
    }

    func stopObservers(){
        for observer in observers{
            observer.invalidate()
        }
        observers.removeAll()
    }

    func load(_ uploadTask: UploadTask ) {

        let observer = uploadTask.observe(\.progress, options: [.initial, .new]) { [weak self] (uploadTask, change) in

            DispatchQueue.main.async {          
                someLabel.text = “\(uploadTask.progress)”
            }
        }
        observers.append(observer)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...