Несколько проблем с загрузкой изображений
Я пытаюсь загрузить несколько отдельных изображений, пока я загружаю их 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)