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

Вот реализация класса UploadManager:

import Foundation
import UIKit
class FileUploadManager : NSObject {
// MARK : Variables Declaration
var id: String?
var imgData : Data?
var image: UIImage?
var progress: Double? {
    didSet {
        DispatchQueue.main.async {
          self.progressBlock?(self.progress)
        }
    }
}
var uploadStatus: FileUploadStatus = .notStarted
var progressBlock: ((Double?)->())?
private weak var uploadTask: UploadRequest?

// MARK : Data Init Implementation
convenience init(id: String ,imgData: Data ,img: UIImage) {
       self.init()
       self.id = id
       self.imgData = imgData
       self.image = img
}
private override init() {}

func pauseTask(){
      self.uploadStatus = .pause
      self.uploadTask?.suspend()
}
func resume(){
      self.uploadStatus = .uploading
      self.uploadTask?.resume()
}
func cancelUpload() {
     self.uploadStatus = .failed
    self.uploadTask?.cancel()
}

func uploadImgFile(mimeType:String = "image/png",
fileName:String = "\(UUID().uuidString).png", request: ((URLSessionUploadTask?)->())? = nil, completionHandler: @escaping (MultiImgFileUpload , [String:Any]?, Error?, APIStatus) -> Void) {
if let galleyImgData = imgData {
    self.uploadStatus = .uploading
DispatchQueue.global(qos: .background).async {
    let headersData : HTTPHeaders = [
          "API-KEY": "",
    ]
self.uploadTask = AF.upload(multipartFormData: { multiPart in
multiPart.append(galleyImgData, withName: "", fileName:fileName, mimeType: mimeType)
}, to:  URLHelper.uploadImg, method: .post, headers: headersData) .uploadProgress(queue: .main, closure: { progress in
      self.uploadStatus = .uploading
      self.progressBlock?(progress.fractionCompleted)
}).responseJSON(completionHandler: { data in
      print("Upload finished: \(data)")
}).response { (response) in
switch response.result {
case .success(let result):
     if let getdata = result{
     do {
         if let jsonResponse = try JSONSerialization.jsonObject(with: getdata, options : .allowFragments) as? [String:Any] {
          self.uploadStatus = .uploaded
          completionHandler(self, jsonResponse, nil, .success)
      }
} catch let error as NSError {
      print(error)
  }
}
case .failure(let err):
      self.uploadStatus = .failed
      completionHandler(self, nil, err, .failure)
      }
    }
   }
  }
 }
}

Теперь предположим, что у нас есть массив изображений, которые будут отображаться в табличном представлении, и мы хотим загрузить их, а затем мы можем загрузить их, как показано ниже. Благодаря этому вы можете загружать несколько изображений, отслеживать прогресс и получать статус выполнения с помощью нашего обработчика завершения. В методе выбора tableview вы можете приостанавливать и возобновлять операции, как указано ниже.

// MARK : Images Upload Array Declaration
var ImgsUploadArr = [FileUploadManager]()

// MARK : UITableview DataSource, Delegate Methods Implementation
extension ImgUploadHandlerVC : UITableViewDataSource,UITableViewDelegate{
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return self.ImgsUploadArr.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "ImgUploadTableviewCell", for: indexPath) as! ImgUploadTableviewCell
         if self.ImgsUploadArr.count > 0 {
            let fileUpload = self.ImgsUploadArr[indexPath.row]
            fileUpload.progressBlock = { (pro) in
                cell.imgProgressView.progress = Float(pro ?? 0.0)
          }
          fileUpload.uploadImgFile { (fileUploadGet, response, error, status) in
DispatchQueue.main.async {
        if status == .success{
           // MARK : Handle Response
        }
       }
      }
    }
   return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     let cell = tableView.cellForRow(at: indexPath) as! ImgUploadTableviewCell
let fileUpload = self.ImgsUploadArr[indexPath.row]
if fileUpload.uploadStatus == .uploading {
       fileUpload.pauseTask()
       cell.playPauseButton.setImage( imageLiteral(resourceName: "resume"), for: .normal)
}
else if fileUpload.uploadStatus == .pause {
       fileUpload.resume()
       cell.playPauseButton.setImage( imageLiteral(resourceName: "pause"), for: .normal)
      }
    }
}

Спасибо за чтение :)