Когда я обновляю свой пользовательский интерфейс в ответ на асинхронное действие, где я должен вызвать DispatchQueue? - PullRequest
0 голосов
/ 28 сентября 2018

В моем приложении для 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, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 28 сентября 2018

Имеет ли значение, какой подход я выберу?Кажется, что лучше иметь блок DispatchQueue внутри функции presentAlert, поэтому мне не нужно включать DispatchQueue.main.async всякий раз, когда я хочу вызвать presentAlert?

Нет разницы междудва подхода.Но недостаток второго подхода, как вы сказали, заключается в том, что вы должны обернуть все вызовы в presentAlert вокруг закрытия DispatchQueue.main.async.

Нужно только явно отправить блок наосновная очередь, когда вы (или используемая вами среда) «переместились» в фоновую очередь?

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

Если есть какие-либо внешние ресурсы, которые могут помочь моему пониманию GCD,пожалуйста, дайте мне знать!

В Интернете есть много источников, чтобы лучше понять GCD.Проверьте это Raywenderlich учебник .Это хорошее место для начала.

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

...