1

У меня есть UITableViewController, встроенный в контроллер навигации. Моя кнопка RightBarButtonItem - кнопка обновления. При нажатии кнопка запускает обновление с сервера. Обновление является синхронным (когда у меня есть время, я изменю его на асинхронный запрос). То, что я хочу сделать, звучит просто теоретически. После того, как нажата кнопка:UINavigationBar не обновляет элемент панели бара до тех пор, пока обновление таблицы не появится

  • Изменить панель кнопок пункт к UIActivityIndicatorView
  • Обновить данные
  • Перезагрузите Tableview
  • Изменение бар кнопки элемент обратно на кнопку обновления.

То, что происходит, однако, заключается в том, что я буду установить rightBarButton на вид с точки зрения индикатора активности, но он никогда не получает обновленный до после на вид перезагружается стол, что, очевидно, бессмысленно. Моя процедура обновления сервера выглядит так:

  • View Controller вызывает метод «обновления» отдельного объекта модели.
  • объект модели синхронно получает новые данные с сервера
  • Просмотреть вызовы контроллеров [self.tableView reloadData];

Поскольку это синхронно, я думал, что он просто прогрессирует на один шаг за раз, но это не работает. Как я могу сделать это так, чтобы ActivityIndicatorView показывал и исчезал, когда он должен был?

+0

Этого можно ожидать от синхронного запроса, он заблокирует ваш основной поток. – duci9y

+0

Именно поэтому я смущен. Вещи происходят не по порядку, но они не должны быть, если они синхронны. – Halen

+0

Возможно, у вас есть код, который вышел из строя. Не ждите, когда вы измените навигационную панель, обновления будут отмечены, но не будут применяться до следующего цикла перерисовки экрана. Но вы блокируете основной поток, а основной поток - это когда пользовательский интерфейс нарисован. Следовательно, нет обновления экрана и обновлений панели навигации. – duci9y

ответ

1

При изменении панели навигации изменения фактически не применяются к экрану немедленно, они применяются во время следующего цикла обновления экрана или следующего обновления экрана или следующего перерисовки.

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

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

+0

Я изменил свое обновление на асинхронное, и он работает намного лучше. Перед обновлением кнопка переходит на индикатор активности. Однако в моем методе делегата, который вызывается после завершения асинхронного обновления, элемент кнопки панели не возвращается к кнопке обновления. Обновление таблицы и я могу взаимодействовать с пользовательским интерфейсом, но кнопка не изменяется. Есть идеи? – Halen

+0

@Halen Я предлагаю вам задать новый вопрос, так как это другая проблема. – duci9y