Индикатор активности (счетчик) с UIActivityIndicatorView - PullRequest
4 голосов
/ 14 февраля 2010

У меня есть tableView, который загружает канал XML следующим образом:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if ([stories count] == 0) {
        NSString *path = @"http://myurl.com/file.xml";
        [self parseXMLFileAtURL:path];
    }
}

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

Я думал, что начало в viewDidAppear и конец в -(void)parserDidEndDocument:(NSXMLParser *)parser, но это не сработало.

Буду признателен за хорошее объясненное решение о том, как реализовать это решение.

Ответы [ 4 ]

5 голосов
/ 15 февраля 2010

Вот проблема: NSXMLParser - это синхронный API. Это означает, что как только вы вызовете parse на вашем NSXMLParser, этот поток будет полностью зависать при разборе XML, что означает отсутствие обновлений пользовательского интерфейса.

Вот как я обычно решаю это:

- (void) startThingsUp {
  //put the spinner onto the screen
  //start the spinner animating

  NSString *path = @"http://myurl.com/file.xml";
  [self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path];
}

- (void) parseXMLFileAtURL:(NSString *)path {
  //do stuff
  [xmlParser parse];
  [self performSelectorOnMainThread:@selector(doneParsing) withObject:nil waitUntilDone:NO];
}

- (void) doneParsing {
  //stop the spinner
  //remove it from the screen
}

Я использовал этот метод много раз, и он прекрасно работает.

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

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

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

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

- (Недействительными) submit_Clicked: (идентификатор) событие { [self.spinner startAnimating]; [self executeSelector: @selector (displayComposerSheet) withObject: nil afterDelay: 0]; }

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

2 голосов
/ 15 февраля 2010

Обычно я использую NSTimer, который вызывает мой метод счетчика, который я запускаю прямо перед тем, как приступить к тяжелой работе (работе, которая обычно блокирует основной поток).

Запускается NSTimer и вызывается мой метод счетчика. Когда основная работа закончена, я отключаю счетчик.

Код для этого:

IBOutlet UIActiviyIndicatorView *loginIndicator;

{
    ...
    [loginIndicator startAnimating];

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(executeAuthenticationRequest) 
                                   userInfo:nil repeats:NO];   
    ...
}

- (void) executeAuthenticationRequest
{
    /* Simulate doing a network call. */
    sleep(3);

    [loginIndicator stopAnimating];

    ...
}

Вы также можете сделать:

IBOutlet NSProgressIndicator *pIndicator;

Начало:

[pIndicator startAnimation:self];
[pIndicator setHidden:NO];

И остановка:

[pIndicator stopAnimation:self];
[pIndicator setHidden:YES];
1 голос
/ 15 февраля 2010

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

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

Вы сможете исправить это, выполнив следующие действия:

  1. В viewDidAppear показать / анимировать счетчик, а затем вызвать

    [self executeSelector: @selector (myXMLParsingMethod) withObject: nil afterDelay: 0];

  2. В myXMLParsingMethod проанализируйте ваш XML, затем спрячьте / остановите счетчик.

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

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