Понимание потоков очереди отправки - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над проектом, который собирает (1000+) точек данных из базы данных и обновляется каждые несколько секунд.Чтобы мой основной поток не блокировался, я должен читать, сортировать и сохранять данные в фоновом потоке.Я хотел бы понять разницу между двумя фоновыми вызовами.

В этой статье автор дает нам хороший пример использования фонового потока, например: DispatchQueue(label: "foo", qos: .utility).async {}

В другом примере на этом сайте я нашел отличный пример расширения DispatchQueue.Этот не использует метку.

Я знаю, что эти два метода различны, но как именно (кроме одного, являющегося расширением)?Второй вопрос: лучше ли дождаться завершения фоновой активности потока, прежде чем вызывать его снова?Или это имеет значение?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я согласен на 100% со всем, что Мэтт сказал (+1).

Пара дополнительных замечаний:

  1. Как он сказалключевое отличие состоит в том, что глобальные очереди являются параллельными очередями, тогда как при создании очереди по умолчанию она является последовательной очередью.Например, это последовательная очередь:

    let queue = DispatchQueue(label: "foo", qos: .utility)
    

    Конечно, вы можете создать собственную параллельную очередь:

    let queue = DispatchQueue(label: "foo", qos: .utility, attributes: .concurrent)
    
  2. Давайте на секунду предположим, что вырешил, что вы действительно хотите использовать параллельную очередь.Тогда возникает вопрос, почему вы создадите свою собственную именованную параллельную очередь вместо одной из глобальных очередей.Есть несколько причин:

    • Вы можете увидеть ваши собственные имена очередей при отладке в Xcode и Instruments.Например, здесь есть точка останова, где я вижу, в какой очереди находится моя точка останова (а также какие другие потоки используются этой очередью):

      enter image description here

    • Некоторые более продвинутые методы, такие как барьеры, не могут быть выполнены в глобальных очередях.Для этого узкого набора приложений вы можете использовать собственную настраиваемую параллельную очередь.

0 голосов
/ 27 ноября 2018

Единственное поверхностное различие между поведением очереди отправки, которую вы создаете самостоятельно (первый пример), и встроенной global очереди отправки (второй пример) состоит в том, что первая является последовательной (по умолчанию), в то время какпоследний является параллельным.

Второй вопрос: лучше ли ждать

Это никогда право "ждать".Если у вас есть несколько задач для координации, вы можете использовать GCD для этого (например, группы отправки).

...