2015-10-29 5 views
0

У меня есть приложение, которое может иногда выполнять значительную обработку ЦП. Последовательности событий будет:Индикатор активности не отображается для задачи с интенсивным процессором

1) Запрашивать вопросы 2) начать индикатор активности 3) делает ЦП интенсивного материал 4) дисплея результата

Однако, когда я запускаю это, деятельность индикатор не отображается на шаге 2, а только на шаге 4. Я считаю, что это связано с тем, что пользовательский интерфейс не обновляется ОС. Любые идеи о том, как решить эту проблему?

+2

Можем ли мы увидеть код, который поможет вам? –

ответ

0

Вы можете явно указать основному потоку, чтобы дождаться завершения действия.

[self performSelectorOnMainThread:@selector(startActivityIndicatorMethod) withObject:nil waitUntilDone:YES]; 

или, если это не работает, вы можете попробовать запустить его на фоне потока:

[self performSelectorInBackground:@selector(startActivityIndicatorMethod) withObject:nil]; 
+0

Что это такое? В лучшем случае это полная догадка. Нечего делать, если предположить, что это решит проблему. – Fogmeister

+0

У меня была та же проблема, что индикаторы активности не начинались и не останавливались, когда ожидалось, даже при низких нагрузках на ЦП. Это исправило эту проблему для меня. – alicooke

0

Вы должны использовать основную очередь для связанных UI вещей, как это и код выше воны» т. е. в Свифт. В быстром правильном порядке это делается:

dispatch_async(dispatch_get_main_queue()) { 
//update UI 
} 
+0

Пробовал, но он не работает. Я понимаю, что это выглядит как самая логичная вещь. Код действительно отправлен в точке 4 в моем первоначальном сообщении, то есть ПОСЛЕ всех вычислений ЦП. В любом случае, спасибо –

+0

Ну, тогда вы можете отредактировать свой оригинальный пост с помощью какого-то кода, чтобы показать, что вы пробовали? – pbush25

+0

, если source_shop_rowid> 0 && destination_shop_rowid> 0 { dispatch_async (dispatch_get_main_queue()) { печати ("A.dispatch issed") self.activity_indicator.startAnimating() } go_calculate()} –

0

Хорошо, поэтому я решил эту проблему с помощью простого простого элементарного решения.

Оригинальная последовательность событий была: 1) задавать вопросы пользователей 2) запустить индикатор активности 3) делать ресурсоемкие расчеты результаты 4) дисплей.

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

1) задавать вопросы пользователей 2) начать индикатор активности 3) отправка товара асинхронных делать ресурсоемкие расчеты результаты 4) дисплея.

В настоящее время пользовательский интерфейс правильно показывает индикатор активности, занятый в точке 2

Смежные вопросы