Для обработки загрузки нескольких файлов и таких событий, как отмена запроса, пауза и возобновление загрузки, мы будем обрабатывать ее через массив диспетчера загрузки файлов. Будет массив файлов, скажем изображений. мы будем обрабатывать это через диспетчер загрузки нескольких файлов для каждого изображения в списке. Я использовал 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) } } }
Спасибо за чтение :)