Когда использовать основную очередь

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

dispatch_async(dispatch_get_main_queue()) { UI update code here } 

Как насчет этих других случаев?

В моем представленииDidLoad () у меня есть код для стилизации навигационной панели и панели инструментов, как показано ниже:

  let nav = self.navigationController?.navigationBar nav?.barStyle = UIBarStyle.Default nav?.tintColor = UIColor.blackColor() nav?.barTintColor = UIColor(red:133.0/255, green:182.0/255, blue:189.0/255, alpha:1.0) let toolBar = self.navigationController?.toolbar toolBar?.barTintColor = UIColor(red:231/255, green:111/255, blue:19.0/255, alpha:1.0) toolBar?.tintColor = UIColor.blackColor() 

Должен ли я обернуть этот код внутри основной очереди?

В моей функции tableView cellForRowAtIndexPath я должен обернуть весь код, настраивая пользовательский интерфейс каждой ячейки таблицы в главной очереди?

Когда я представляю новый modal controller (self.presentViewController (modalController, animated: true, completion: noil), должен ли я обернуть это внутри основной очереди?

Ответ на все ваши вопросы – «нет»,

Если не указано в документации, все функции UIKit будут вызываться в основной очереди.

Как правило, вам нужно специально запустить в главной очереди после вызова функции async с обработчиком завершения, который выполняется в фоновом режиме. Что-то вроде…

 // downloadImage is some func where the // completion handler runs on a background queue downloadImage(completion: { image in DispatchQueue.main.async { self.imageView.image = image } }) 

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

Как говорит Эшли, методы UIKit автоматически вызывают из основной очереди – вот как они выглядят. Следовательно, некоторые структуры имеют методы, которые автоматически вызывают из фоновой очереди.

Я знаю, что функция возобновления функции dataTask URLSession автоматически выполняется в фоновом режиме (так что приложение не замедляется веб-соединением), что означает, что обработчик завершения, который выполняется после этого, работает в фоновом режиме. Вот почему любые обновления пользовательского интерфейса, которые происходят в обработчике завершения, требуют вызова в основной очереди.

 let dataTask = URLSession.shared.dataTask(with: request) { // begin completion handler (data, response, error) in guard error == nil else { print("error \(error.debugDescription)"); return } guard let data = data else { print("no data"); return } do { if let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]] { print("sending returned JSON to handler") self.responseHandler.handleAPIResponse(jsonArray: json) >>>> DispatchQueue.main.async { <<<< self.tableView.reloadData() } } } catch { print("get tasks JSONSerialization error") } } dataTask.resume() 
  • reloadRows создаст новую ячейку
  • Как / где я использую NSNumberFormatter?
  • Не удается заставить MapKit работать
  • UITableView дополнительное пространство при наличии двух вкладок бок о бок, которые используют один и тот же tableView
  • Возможно ли получить название цвета в быстрой
  • Почему удаление данных в Firebase removeValue () не работает?
  • Получить первый UIButton в UIStackView
  • RealmSwift - Как хранить данные в списке
  • Параметры сообщения, не достигающие API из приложения
  • дата просмотра таблицы выбрана только длительное нажатие
  • Добавление ограничений в imageview в коллекцииViewCell
  • Давайте будем гением компьютера.