фоновый поток выполняется перед основным потоком ios swift - PullRequest
0 голосов
/ 05 марта 2020

Я хочу создать контроллер представления sh и хочу, чтобы остальные задачи работали в фоновом режиме без зависания интерфейса. но либо мой пользовательский интерфейс зависает, либо фоновый поток выполняется раньше. Прилагается небольшой пример моей работы.

DispatchQueue.global(qos: .background).async {
        DispatchQueue.main.async {
            print("This is run on the main queue, after the previous code in outer block")
        }
        print("This is run on the background queue")
    }

Результат:

This is run on the background queue
This is run on the main queue, after the previous code in outer block

Основная очередь должна была быть выполнена первой, чем фоновый поток.

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Ваш код в основном выполняется так:

// 1. Send this code off to the global queue to be processed async
DispatchQueue.global(qos: .background).async {
  // 3. You're here once the global queue decides it's ready to run this code

  // 4. Send this code off to the main queue to be processed async
  DispatchQueue.main.async {
    // 6. You're here once the main queue decides it's ready to run this code
    print("This is run on the main queue, after the previous code in outer block")
  }

  // 5. This is now printed
  print("This is run on the background queue")
}

// 2. whatever happens here

Причина, по которой ваш код работает так, заключается в том, что вы отправляете все асинхронно. это означает, что все, что вам нужно сделать, это передать закрытие для выполнения целевой очередью позже или всякий раз, когда она будет готова. Используя asyn c, вы сообщаете очереди, что не хотите этого ждать.

Если вы хотите, чтобы бит основной очереди запускался немедленно, вы можете использовать DispatchQueue.main.sync вместо этого. Это будет блокировать выполнение контекста, в котором вы находитесь (в данном случае закрытие async, которое вы передали в глобальную очередь), пока закрытие, с которым вы работаете с sync, не будет завершено.

Обычно я бы рекомендовал избегать sync, если вам действительно это не нужно, потому что слишком легко заставить очередь ждать себя и быть заблокированной навсегда (тупик).

0 голосов
/ 05 марта 2020

Попробуйте добавить задержку к фоновым задачам - чтобы увидеть, что происходит

DispatchQueue.global(qos: .background).async {
    DispatchQueue.main.async {
        print("This is run on the main queue")
    }

    longRunningFunction
    print("This is run on the background queue")
}


func longRunningFunction() {
    sleep(1)
}

Теперь вы увидите ожидаемый результат.

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