Как сделать несколько запросов Alamofire с запросом операции - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть приложение, которое загружает несколько изображений на сервер, используя Alamofire . Каждое изображение нуждается в маркере загрузки перед загрузкой на сервер. Итак, в цикле for для каждого файла изображения

  1. Я делаю запрос на получение через Alamofire для получения токена загрузки

  2. После получения токена я делаю запрос на загрузку через Alamofire с этим токеном.

Вот мой код:

func uploadFile(image: imageToUpload, onCompletion: @escaping ((Bool) -> Void)) {

   ...//some code

   // Alamofire request to get an upload token
   getUploadToken() { uploadToken in 

   if uploadToken != nil {
       // Alamofire request to make the upload with uploadToken and image data
       makeUploadRequest(token: uploadToken, image: imageToUpload) { uploadResponse in 
              onCompletion(uploadResponse)
       }
   }
}

И это мой цикл for для перебора изображений для загрузки:

DispatchQueue.global(qos: .background).async {
    let group = DispatchGroup()
    for fileToUpload in filesToUpload {
        group.enter()
        FileOperations.shared.uploadFile(image: fileToUpload) { hasFinished in
            if hasFinished {
                group.leave()
            }
        }
        group.wait()
    }
}

Так что мне нужно использовать очереди для реализации этого. Мой код должен работать так:

  1. Очередь 1: запрос getUploadToken для изображения 1.
  2. Очередь 2: makeUploadRequest для изображения 1.
  3. Очередь 3: запрос getUploadToken для изображения 2.
  4. Очередь 4: makeUploadRequest для изображения 2.

... и т. Д.

Таким образом, только после того, как изображение 1 в цикле for завершит весь свой процесс, изображение 2 может начать свой процесс. С очередями, даже если приложение фоновое, оно должно работать.

Как мне добиться такого поведения с помощью очередей?

Я могу заставить эту работу работать с DispatchGroup(), но она не работает, когда приложение подключено. Я исследовал и прочитал все в Интернете, но я не мог заставить что-то работать. Поэтому я хочу, чтобы это работало с очередями. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Можете ли вы изменить свой код на следующий и проверить, правильно ли загружены, например, три изображения.

let group = DispatchGroup()
DispatchQueue.global(qos: .background).async {
    for fileToUpload in filesToUpload {
        group.enter()
        FileOperations.shared.uploadFile(image: fileToUpload) { hasFinished in
            if hasFinished {
                group.leave()
            }
        }
    }
}

group.notify(queue: .main) {
    print("Finished all upload requests.")
}
0 голосов
/ 16 апреля 2019

Вы правы, вы можете сделать это с OperationQueue, все, что вам нужно сделать, это подкласс Operation, чтобы настроить его на выполнение необходимых действий, инициализировать OperationQueue и настроить его для запускафоновый поток и разрешить только одну параллельную задачу.Затем добавьте операции в очередь в нужном вам порядке, и они начнут выполняться.

...