Несколько проблем с загрузкой изображений

Я пытаюсь загрузить несколько отдельных изображений, пока я загружаю их 1 во время работы. Но как только я пытаюсь загрузить следующее изображение или несколько изображений, начинаются проблемы. каждое изображение, которое я загружаю в серию, будет обновлять все изображения в соответствии с последним загруженным изображением. Когда я сделал более одного изображения до того, как была загружена последняя, ​​это будет мешать прогрессированию других, случайным образом показывая различные числа загрузок.

вот как я обновляю свой интерфейс:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "uploadQueueCell", for: indexPath) as! UploadQueueCustomCell

        if cell.progress.text?.lowercased() == "percentage".lowercased()
        {
            cell.progress.text = "0"
        }
            if indexPath.row < uploader.GetUploadQueue().Count()
            {
                let item = uploader.GetUploadQueue().Get(pos: indexPath.row)
                cell.filename.text = item._FileName
                let percentage = String(item._Percentage)
                cell.progress.text = percentage
                cell.cell_image.image = UIImage(data: item._ImageData)
            }
            updateView()
               return cell

    }
    public func updateView() {
            DispatchQueue.main.async
            {
                self.tableView.reloadData()
            }
    }

Вот как хранятся отдельные элементы в моем массиве:

public class UploadQueueCellData
{
    public let _FileName:String
    public let _UploadTaskDelegate:URLSessionTaskDelegate
    public let _ImageData:Data
    public let _TaskIdentifier:Int

    public init(fileName:String,imageData:Data,uploadTaskDelegate:URLSessionTaskDelegate,taskIdentifier: Int)
    {
        _FileName = fileName
        _ImageData = imageData
        _UploadTaskDelegate = uploadTaskDelegate
        _TaskIdentifier = taskIdentifier
    }
    public var _Percentage:Int
    {
        get
        {
            let test = _UploadTaskDelegate as! UploadDelegate
            let returnval = test._percentage
            return returnval
        }

    }   
}

и мой делегат для загрузки прогрессии

    public class UploadDelegate: URLSessionUploadTask, URLSessionTaskDelegate {
    public var _response:HTTPURLResponse = HTTPURLResponse()
    public var _error:String? = nil
    public var _percentage:Int = 0
    public var _Filename:String? = nil
    public var _urlSessionTask:URLSessionTask? = nil


    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    {
        _error = error.debugDescription
    }
    public func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)//->Int
    {
        //Progression
        let progress = Float(totalBytesSent)/Float(totalBytesExpectedToSend)
        _urlSessionTask = task
        DispatchQueue.main.async
        {
            self._percentage = Int(progress * 100)
        }
    }
}

Я не знаю, как разделить отдельные загрузки и следить за их продвижением, и все, что я делаю, работает только для того, чтобы отслеживать только последнюю загрузку. или обновите их все случайными номерами прогрессии вместо прогрессии, принадлежащей отдельным загрузкам. Есть ли способ на самом деле сделать мою модель отдельной загрузки и отслеживать их отдельно? и как я буду делать это?

Редактировать:

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

2 ответа

Решение

Я нашел решение.

Мое решение состояло в том, чтобы попытаться отследить, по какому файлу я получаю прогрессию. Я знаю, что это, вероятно, не изящное решение, но оно работает, я сделал это следующим образом:

 public func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)//->Int
        {
            //Progression
            _Filename =  task.currentRequest?.value(forHTTPHeaderField: "filename")
            let progress = Float(totalBytesSent)/Float(totalBytesExpectedToSend)
            _urlSessionTask = task
            DispatchQueue.main.async
            {
                self.objQueue?.Get(filename: self._Filename!)._Percentage = Int(progress * 100)
              //  self._percentage = Int(progress * 100)
            }
        }

остальное в значительной степени так же, как и раньше.

за одним небольшим исключением:

public class UploadQueueCellData//:NSObject, UploadURLSessionTaskDelegate
{
    public let _FileName:String
    public let _UploadTaskDelegate:URLSessionTaskDelegate
    public let _ImageData:Data
    public let _TaskIdentifier:Int
    public init(fileName:String,imageData:Data,uploadTaskDelegate:URLSessionTaskDelegate,taskIdentifier: Int)
    {
        _FileName = fileName
        _ImageData = imageData
        _UploadTaskDelegate = uploadTaskDelegate
         _TaskIdentifier = taskIdentifier

    }
    private var intPercentage:Int = -1
    public var _Percentage:Int
    {
        get
        {
             return self.intPercentage
        }
        set
        {
            self.intPercentage = newValue

        }
    }



}

Ваше решение заключается в рекурсии. Просто дайте основную идею с примером надежды, что вы в нее вникнете и создадите согласно требованиям.

например, у вас есть imageArray с 10 изображениями

        func uploadImageATIndex(index:Int,uploadArray:[UIImage]){
                var position = index

                    self.uploadImageRemote(uploadArray[position]){ dataImage, error -> Void in
                                  //callback when image is uploaded 

                 //check whether position is the last index or not.if not than again call self
                        if !(position == uploadArray.count - 1){
                            position = position+1
                                  //increase the position and again call the self
                            self.uploadImageATIndex(position,uploadArray: uploadArray)
                        }else{
                         //when index becomes equal to the last index return
                            return
                        }
                    }
            }

вызвать этот метод только один раз, указав индекс 0

self.uploadImageATIndex(0,imageArray)
Другие вопросы по тегам