Быстрая загрузка нескольких файлов параллельно в AWS S3 и отображение статуса просмотра хода выполнения в ячейке таблицы.
Я новичок в AWS, я выполнил загрузку некоторых файлов в AWS S3 с преобразованием файлов TransferUtility. Здесь мои шаги сценария
1. Выбор файлов из iCloud
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
let fileurl: URL = url as URL
let filename = url.lastPathComponent
let file-extension = url.pathExtension
let filedata = url.dataRepresentation
// Call upload function
upload(file: fileurl, keyname: filename, exten: file-extension)
// Append names into array
items.append(item(title: filename, size: string))
self.tableView_util.reloadData()
2. Загрузите этот файл в AWS S3 с помощью утилиты передачи
private func upload(file url: URL, keyname : String, exten: String) {
transferUtility.uploadfile(file ur,
bucket: "YourBucket",
key: "YourFileName",
contentType: "text/plain",
expression: expression,
completionHandler: completionHandler).continueWith {
(task) -> AnyObject! in
if let error = task.error {
print("Error: \(error.localizedDescription)")
}
if let _ = task.result {
// Do something with uploadTask.
}
return nil;
}
3. При загрузке необходимо показывать каждый статус загрузки файла в ячейку таблицы.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellutil", for: indexPath) as! UtilityTableViewCell
let item = items[indexPath.row]
}
Моя проблема: в виде таблицы я могу показать загружаемые элементы, но первая загрузка остановилась, когда я загружаю следующий. Мне нужно добиться параллельной загрузки нескольких файлов и отображения статуса ячейки.
1 ответ
Для этого вы создаете очередь операций, и каждый загружаемый файл записывает сетевой запрос внутри операции и добавляет эти операции в очередь.
Здесь я даю подсказку, чтобы сделать это.
Создайте класс модели, который имеет такие свойства, как
struct UploadRecordData {
let fileName:String
let unique_id:String
let progress:double
//...etc
}
а затем подкласс операции, как это
struct UploadRecordOperation:Operation{
let uploadRecordData:UploadRecordData
//etc..
//update progess inside of operation class
func updateProgress(progress:Double){
uploadRecordData.progress = progress
//edited answer
let myDict = [ "progress": progress, "unique_id":unique_id]
NSNotificationCenter.defaultCenter().postNotificationName("refreshProgressBar", object:myDict);
}
}
Теперь вот часть контроллера табличного представления
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath)
let row = indexPath.row
let uploadRecordData = uploadfilesRecords[row]
//edited answer
cell.progressView.uniqud_id = uploadRecord.unique_id
cell.progressView.progress = uploadRecord.progress
return cell
}
Вот способ обновить ячейку при обновлении обновления загрузки файлов.
Подкласс вашего прогресса просмотра, как это
struct ProgressView:YourProgressView{
var unique_id:int
//Now add notification observer to your progress view
NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressView), name: "refreshProgressBar", object: nil)
func refreshProgressView(notification: NSNotification){
let dict = notification.object as! NSDictionary
let progress = dict["progress"]
let u_id = dict["unique_id"]
if u_id == self.unique_id {
self.progress = progress
}
}
Пожалуйста, см. Выше обновленный код в подклассе Operation и методе делегирования табличного представления.
Вот мое решение, пожалуйста, дайте мне знать, что вы его получили. Спасибо Счастливого кодирования!!!