Почему блок кода синхронизации всегда вызывается в главном потоке? - PullRequest
0 голосов
/ 23 октября 2018

Я сделал простой тест с DispatchQueue:

DispatchQueue.global(qos: .background).sync {
  if Thread.isMainThread {
    print("Main thread")
  }
}

Он распечатал:

Main thread

Почему этот код выполняется в главном потоке?Это должно выполняться в фоновом потоке (он был добавлен в фоновую очередь), верно?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Проблема в том, что вы задали неправильный вопрос.Не путайте очереди и потоки.Работайте с очередями и позвольте их перенастроить потоки по мере необходимости.Именно поэтому у нас есть очереди!Вы не должны беспокоиться о том, что вы нить .Все, что вам нужно знать , это то, что вы находитесь на правильной очереди , которую вы можете узнать следующим образом:

let q = DispatchQueue.global(qos: .background)
q.sync {
    dispatchPrecondition(condition: .onQueue(q))
    print("it's okay! we're on the right queue") // yep
}
0 голосов
/ 23 октября 2018

Потому что на самом деле это не обязательно.Вы блокируете основной поток с помощью синхронизации.iOS предпочитает просто выполнить его в главном потоке, вместо того, чтобы переключаться на фоновый поток (фоновую очередь), так как это на самом деле не имеет значения, поскольку основной поток все равно блокируется.

Документы Apple (и справка) к функции синхронизации относится строка:

В качестве оптимизации эта функция при возможности вызывает блок в текущем потоке.

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