2010-03-06 7 views
3

есть ли способ отображения анимированного прялки, в то время как основной поток выполняет длительную операцию? Анимация обрабатывается тем же потоком, который создал UIActivityIndicatorView, правильно? Если да, могут ли представления, принадлежащие нескольким потокам, находиться в одной иерархии представлений?Запустите UIActivityIndicatorView, когда основной поток занят

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

EDIT: «длительный» составляет около 2 секунд на устройстве 1-го поколения.

ответ

7

Решение состоит в том, чтобы запустить анимацию, по крайней мере, одну итерацию в цикле запуска, прежде чем запускать длительную операцию. Например:

[activity startAnimating]; 
[self performSelector:@selector(lengthyOperation) withObject:nil afterDelay:0]; 

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

+0

Heck, я был близок :) Пробовал выполнитьSelectorOnMainThread, но похоже, что задержка была ключом. –

+2

@Seva Запуск длительных операций по основной теме, как правило, плохая идея. – Giao

+0

Что говорит Гьяо, это правда. Однако, если вам нужно, чтобы приложение приостанавливалось во время его выполнения, это не похоже на идею TERRIBLE. Однако лучшим решением может быть использование [[UIApplication sharedApplication] beginIgnoringInteractionEvents] и endIgnoringInteractionEvents, когда вы закончите. –

5

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