Swift: синхронно выполнять код в фоновом режиме; queue.sync не работает, как я ожидал бы

Я хотел бы выполнить некоторый код синхронно в фоновом режиме, я действительно думал, что это путь:

let queue = DispatchQueue.global(qos: .default)
queue.async {
    print("\(Thread.isMainThread)")
}

но это печатает true если я не использую queue.async. async невозможно, так как код будет выполняться параллельно. Как я могу выполнить несколько блоков синхронно в фоновом режиме?

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

+2
источник поделиться
2 ответа

Выполнение Async не является вашей проблемой, так как вы заботитесь только о порядке выполнения ваших блоков кода относительно друг друга, но не относительно основного потока. Вы не должны блокировать основной поток, который на самом деле DispatchQueue.main а не DispatchQueue.global.

То, что вам нужно сделать, это выполнить ваш асинхронный код в последовательной очереди, поэтому вы не блокируете основной поток, но по-прежнему убедитесь, что блоки кода выполняются последовательно.

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

let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.async{  //call this whenever you need to add a new work item to your queue
    //call function here
}
+1
источник

DispatchQueue не равно Thread. Подумайте об этом как о некоторой абстракции над пулом потоков.

При этом главная очередь действительно "фиксирована" в основном потоке. И поэтому, когда вы синхронно отправляете рабочий элемент из основной очереди, вы все еще находитесь в основном потоке.

Чтобы фактически выполнить sync код в фоновом режиме, вы уже должны быть в фоновом режиме:

    DispatchQueue.global().async {
        DispatchQueue.global().sync {
            print("\(Thread.isMainThread)")
        }
    }

Это напечатает false.

Кроме того, поскольку пользователь @rmaddy правильно указал в комментариях, выполнение любых дорогостоящих задач синхронно с основной очередью может привести к тому, что ваша программа перестанет отвечать на запросы, поскольку основной поток отвечает за обновления пользовательского интерфейса.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос