Swift Threading: когда использовать DispatchQueue.main.async? - PullRequest
0 голосов
/ 06 июня 2018

Мне кажется, я понимаю, что делает очередь отправки, когда я ее вызываю, но я не уверен, когда именно мне следует ее использовать, и в чем ее преимущества, когда я ее использую.

Если мое пониманиеправильно, DispatchQueue.main.async {// code} будет планировать код, содержащийся в замыкании, для выполнения в основной очереди отправки в асинхронном режиме.Основная очередь имеет наивысший приоритет и обычно зарезервирована для обновления пользовательского интерфейса, чтобы максимизировать скорость отклика приложения.

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

Пример кода:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        updateUI()
    }

}

В сравнении:

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        DispatchQueue.main.async {
            updateUI()
        }
    }
}

Какой из них будет обновлять пользовательский интерфейс быстрее?

1 Ответ

0 голосов
/ 06 июня 2018

Основное использование DispatchQueue.main.async - это когда у вас работает код в фоновой очереди и вам нужен определенный блок кода для выполнения в главной очереди.

В вашем коде viewDidLoad - этоуже запущен в основной очереди, поэтому нет особых оснований для использования DispatchQueue.main.async.

, но это не обязательно неправильно.Но это меняет порядок выполнения.

Пример без:

class MyViewController: UIViewController {
    func updateUI() {
        print("update")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("before")
        updateUI()
        print("after")
    }
}

Как и следовало ожидать, вывод будет:

до
обновить
после

Теперь добавьте DispatchQueue.main.async:

class MyViewController: UIViewController {
    func updateUI() {
        print("update")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("before")
        DispatchQueue.main.async {
            updateUI()
        }
        print("after")
    }
}

И выходные данные изменятся:

до
после
update

Это связано с тем, что асинхронное закрытие ставится в очередь для запуска после завершения текущего цикла выполнения.

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