Удалить изначально неактивную очередь - PullRequest
1 голос
/ 26 марта 2020

У меня есть массив фотографий, которые нужно загрузить, но функция загрузки может загружать только одну фотографию за раз. Мне нужно убедиться, что функция загрузки завершена, прежде чем я вызову ее для другой фотографии. Я создаю .initialyInactive DispatchQueue, и очередь активируется в блоке завершения функции загрузки. Это просыпается, и фотографии загружаются, но мой вопрос, как отменить процесс загрузки? Можно ли как-то удалить неактивированные очереди?
Мой код logi c выглядит примерно так ..

 func downloadPhoto(photo: Photo, completion: (_ success: Bool) -> Void) {
    ... completion(true) ..
}
for photo in photos {
      let queue = DispatchQueue(label: "Download queue\(counter)", qos: .userInitiated, attributes: .initiallyInactive)
       self.inactiveQueues[counter] = queue

       queue.async {

           self.downloadPhoto(photo: photo) { (success) in
                  nextQueue?.activate()
                   if success {
                          ...
                   } else {
                          ...
                   }
           }
}

Ant и другое решение моей проблемы тоже отлично. Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

Существует несколько вариантов:

  1. Исторически мы использовали собственный асинхронный подкласс Operation. См. { ссылка } (или см. { ссылка } для альтернативной реализации AsynchronousOperation). Это дает нам отменяемую операцию, и мы можем легко контролировать степень параллелизма.

    Если вы хотите загружать их по одному, вы можете установить maxConcurrentOperationCount в очереди равным 1. Затем вы можете просто добавить свой загружать операции на один OperationQueue, и если вы хотите отменить их, вам нужно позвонить queue.cancelAllOperations().

  2. Если вы нацеливаетесь iOS 13 и позже, Объединение делает это еще проще. См. { ссылка } для примера загрузки серии изображений с использованием Combine (как последовательно, так и с контролируемой степенью параллелизма).

Все это имеет Сказано, что я призываю вас пересмотреть выбор загрузки изображений последовательно. В моем случайном тесте увеличение максимально допустимого параллелизма до 6 привело к загрузкам, которые в целом были в два раза быстрее, чем последовательное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...