2010-08-24 2 views
0

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

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

Спасибо!

ответ

1

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

То, как вы используете поток, зависит от того, что вы хотите сделать, вы можете, например, просто использовать - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg или вы можете создать свой собственный поток и быть более конкретным.

Не забудьте позвонить - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait, если вы хотите внести некоторые изменения в пользовательский интерфейс из другой темы.

Вы найдете все, что вам нужно о программировании потоков в этом guide из справочной библиотеки iOS.

Надеюсь, это поможет!

+0

Спасибо за ответ Ermiar. Эта проблема обновления на самом деле происходит очень часто, когда вам нужно обновить интерфейс, а затем другой пользовательский интерфейс, но не в одно и то же время. Позвольте привести пример. Предположим, я хочу уволить одного контроллера, вызвать этот контроллер 1, а затем отпустить другой контроллер вправо, вызвать этот контроллер 2. Родитель контроллера - контроллер1, а родительский элемент controller1 - контроллер. Тогда эта проблема случится. он фактически уволит первого контроллера, но он не упустит второй контроллер. Как вы думаете, этот случай, у нас нет другого выбора, кроме как создать новый поток? –

+0

Также я использую очень хакерский способ решить эту проблему. Я использую NSTimer для отклонения контроллера1. Любопытно, когда используется NSTimer, создает ли другой поток? –

+0

Это зависит от того, как вы инициализируете свой таймер, если вы используете schedTimerWithTimeInterval, таймер будет создан в текущем цикле в текущем потоке. В противном случае вы должны добавить таймер в цикл выполнения в другом потоке. Вы можете использовать другие методы для выполнения действий в текущем потоке после задержки, например performSelector: withObject: afterDelay: если вы хотите просто подождать что-то. – Ermiar

0

Вы думаете о прогрессе? Если это так, вы можете использовать что-то, используя NSApp (см. Раздел «Управление циклом событий») и используйте runModalForWindow: и runModalSession: они позволят вам открыть панель прогресса, сообщить о состоянии и разрешить метод отмены операция.

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

+0

Я говорю о UIkit от слоя касания какао здесь. не appkit позже из слоя фундамента ... –

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