Требует ли UIActivityIndicator ручной работы с iPhone - PullRequest
8 голосов
/ 14 января 2009

Я запускаю создание приложения для iPhone, которое выполняет дорогостоящую операцию, и я хотел создать ActivityIndicator, чтобы пользователь знал, что приложение не заморожено.

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

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

Нужно ли вручную создавать отдельный поток для запуска моей операции или уже есть поддержка по умолчанию для такого рода поведения?

Ответы [ 5 ]

13 голосов
/ 14 января 2009

Я только что нашел кого-то, кто задавал очень похожий вопрос с хорошим ответом на форумах Apple iPhone. https://devforums.apple.com/message/24220#24220 # Примечание: для просмотра необходимо иметь appleID.

По сути, да, вам действительно нужно запустить процесс в другом потоке, но это довольно легко сделать (как перефразировано от пользователя 'eskimo1')

- (IBAction)syncOnThreadAction:(id)sender
{
    [self willStartJob];

    id myObject = [MyObjectClass createNewObject];
    [self performSelectorInBackground:
        @selector(inThreadStartDoJob:)
        withObject:myObject
    ];
}

- (void)inThreadStartDoJob:(id)theJobToDo
{
    NSAutoreleasePool * pool;
    NSString *          status;

    pool = [[NSAutoreleasePool alloc] init];
    assert(pool != nil);

    status = [theJobToDo countGrainsOfSandOnBeach];

    [self performSelectorOnMainThread:
        @selector(didStopJobWithStatus:)
        withObject:status
        waitUntilDone:NO
    ];

    [pool drain];
}

, где -willStartJob и -didStopJobWithStatus - мои собственные методы, которые:

  • отключить пользовательский интерфейс, чтобы предотвратить запуск пользователем сразу двух заданий
  • настроить индикатор активности
9 голосов
/ 14 января 2009

Да, вам нужно поместить вашу операцию в отдельный поток, пока вызовы UIActivityIndicatorView остаются в основном потоке.

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

Вместо этого начните анимировать индикатор, а затем создайте новую ветку для вашего процесса. Используйте уведомления, шаблон делегата или performSelectorOnMainThread:withObject:waitUntilDone:, чтобы сообщить основному потоку, что процесс завершен. Затем остановите анимацию и продолжайте.

Это гарантирует, что пользователь знает, что что-то происходит, пока ваш процесс делает свое дело.

4 голосов
/ 06 мая 2010

Запуск нового потока может быть излишним и источником сложности, если вы хотите делать вещи, которые должны запускаться в основном потоке.

В моем собственном коде мне нужно запустить MailComposer нажатием кнопки, но это может занять некоторое время, и я хочу убедиться, что UIActivityIndicator вращается.

Вот что я делаю:

-(void)submit_Clicked:(id)event
{
    [self.spinner startAnimating];
    [self performSelector:@selector(displayComposerSheet) 
               withObject:nil afterDelay:0];    
}

Он будет ставить в очередь displayComposerSheet вместо немедленного его выполнения. Достаточно, чтобы вращатель начал анимацию!

0 голосов
/ 16 сентября 2010

Что проще:

1> Have 1 method that starts the spinner (in the background).
2> Run your long-running code right here.
3> Have 1 method that ends the spinner.

или ....

A> Have 1 method that starts the spinner.
B> Have 20 methods (1 for each thing you want to do in the background)
C> Have 1 method that ends the spinner.

Я всегда вижу, как все предлагают A, B, C ... трудный путь.

0 голосов
/ 14 января 2009

UIProgressView (индикатор выполнения) не может работать сам по себе, вам необходимо периодически увеличивать его значение.

UIActivityIndicatorView (вращающаяся шестеренка) может работать самостоятельно: просто вызовите startAnimating , когда вы начнете свою операцию, и stopAnimating , когда вы закончите.

Таким образом, UIActivityIndicatorView может быть тем, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...