多个图像上传进度问题

Posted

技术标签:

【中文标题】多个图像上传进度问题【英文标题】:Multiple Image Upload Progression problems 【发布时间】:2017-03-23 11:59:16 【问题描述】:

我正在尝试上传几个单独的图像,只要我在它工作时上传它们 1。但是,一旦我尝试上传下一张图片或多张图片,问题就开始了。 我在一个系列中上传的每张图片都会随着最新上传的图片的进度更新所有图片。 当我在最后一张上传完成之前拍摄了多张图片时,它会通过随机显示各种上传进度数字来干扰其他图片的进度。

这就是我更新 UI 的方式:

 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)
        
    

我不知道如何分离单个上传并跟踪它们的进度,我所做的一切似乎都是为了只能跟踪最后一次上传。或使用随机进度数字而不是属于单个上传的进度更新所有这些。有没有办法让我的模型将各个上传分开并分别跟踪它们?我该怎么做呢?

编辑:

我想我应该补充一点,我一次发送一张图像,但由于连接性或速度慢,最终可能会缓存的已发送项目队列仍未完成。我只是想显示已发送的单个项目的进度。

【问题讨论】:

【参考方案1】:

您的解决方案在于递归。只是通过示例给出基本想法,希望您深入研究并根据需要创建。

例如。你有 imageArray10 张图片

        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
                        
                    
            

通过提供 index 0

仅调用此方法一次
self.uploadImageATIndex(0,imageArray)

【讨论】:

这是一个很好的例子,但我的问题似乎不相关?我可以上传 X 张图片,但无法获取单个图片的进度。这个似乎没有解决这个问题?我想我可以提一下,我在任何时候都不会一次发送超过一张图像。但根据网络连接和速度,我可能会有几张图片的队列。【参考方案2】:

我找到了解决方案。

我的解决方案是尝试跟踪我收到进度的文件。我知道这可能不是一个很好的解决方案,但它在工作 atm 我是这样做的:

 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

        
    




【讨论】:

以上是关于多个图像上传进度问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 alamofire 上传多个文件并显示进度?

像在 WhatsApp 中一样加载多个图像进度条

使用 PHP 上传多个图像,并将条目提交到 mysql

将多个图像上传到队列中的服务器

添加了图像上传进度条(Paperclip、Javascript),但图像本身没有被保存。我怎样才能解决这个问题?

将图像上传到 Firebase 存储时如何制作进度条?