Как избежать дублирования загрузки файлов с помощью Swift 4 - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь загрузить файлы в AWS S3.Файлы, которые я выбираю из iCloud и добавляю в array для перечисления в tableView и одновременного вызова функции AWS S3 upload.

Здесь, как только файл успешно загружен, мне нужно сделать некоторую идентификацию внутри array потому что всякий раз, когда я пытаюсь загрузить следующие file, мой массив снова выдвигает уже stored файлов.Итак, процесс загрузки дает duplication результатов.Как избежать этой проблемы?

Мое затруднение, если я удаляю загруженный файл url из массива, тогда я не могу перечислить в tableView, но если я не удалил, то это будет re-uploading всякий раз, когда я пытаюсь загрузить новый файл.

// Array declaration
var items = [Item]()
var fileArray = [Item]() 

// Values appending into my array
items.append(Item(indexPath: indexPath, file: item.url))

// TableView data-load 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
    let item = fileArray[indexPath.row]

       if fileArray.count > 0 {
            cell.url_label.text = item.url

            // Upload function call
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
                self.uploadData(indexPath: indexPath, file: item.url)
            })
       }
   return cell
} 

// Upload function with parameters 
private func uploadData(indexPath: indexPath, file: item.url) {

   // Tracking each cell and it's file. 
   // Once, file uploaded I am doing some changes in tableview cell
}

1 Ответ

0 голосов
/ 06 октября 2018

1- Вы не должны выполнять никаких не-пользовательских задач внутри

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {

2- Вы не должны загружать файлы внутри cellForRowAt, так как он вызывается при каждой прокрутке, так что вы наверняка встретитедублирование, если вы хотите сделать это только для видимых ячеек, то внутри модели массива создайте свойство статуса типа Enum, чтобы указать текущее состояние этого файла -> NotUploaded-Uploaded-Uploading и проверить его перед загрузкой


Enum Status {
  case  notUploaded,uploaded,uploading 
}

class Item {
  var st:Status = .notUploaded
  func upload () {
    if st == .notUploaded {
      st =.uploading 
      // upload here
      API.upload {
        self.st = .uploaded 
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...