В моем приложении для iOS я делаю много веб-запросов.Когда эти запросы выполняются / не выполняются, запускается метод делегата в контроллере представления.Метод делегата содержит код, который отвечает за обновление пользовательского интерфейса.В следующих примерах didUpdate(foo:)
- это метод делегата, а presentAlert(text:)
- это обновление моего пользовательского интерфейса.
Без DispatchQueue
, код будет выглядеть так:
func didUpdate(foo: Foo) {
self.presentAlert(text: foo.text)
}
func presentAlert(text: String) {
let alertController = ...
self.present(alertController, animated: true)
}
Когда это произойдетс использованием DispatchQueue
, чтобы убедиться, что мой пользовательский интерфейс будет обновляться быстро, я начинаю терять способность определять, что на самом деле происходит в коде.Есть ли разница между следующими двумя реализациями?
Первый способ:
func didUpdate(foo: Foo) {
self.presentAlert(text: foo.text)
}
func presentAlert(text: String) {
let alertController = ...
DispatchQueue.main.async {
self.present(alertController, animated: true)
}
}
Второй способ:
func didUpdate(foo: Foo) {
DispatchQueue.main.async {
self.presentAlert(text: foo.text)
}
}
func presentAlert(text: String) {
let alertController = ...
self.present(alertController, animated: true)
}
Имеет ли значение, какоеподход, с которым я иду?Кажется, что лучше иметь блок DispatchQueue внутри функции presentAlert
, поэтому мне не нужно включать DispatchQueue.main.async
всякий раз, когда я хочу вызвать presentAlert
?
Нужно ли явно отправлять блок в основную очередь, когда вы (или используемая вами среда) «переместились» в фоновую очередь?
Если есть какие-либо внешниересурсы, которые могут помочь моему пониманию GCD, пожалуйста, дайте мне знать!