Почему мой UIActivityIndicatorView отображается только один раз? - PullRequest
0 голосов
/ 24 марта 2010

Я разрабатываю приложение для iPhone, в котором предусмотрена навигация на основе вкладок с пятью вкладками. Каждая вкладка содержит UITableView, данные которого извлекаются удаленно. В идеале я хотел бы использовать один UIActivityIndicatorView (подпредставление окна), который запускается / останавливается во время этого удаленного поиска - один раз для каждой вкладки.

Вот как я могу настроить счетчик в AppDelegate:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
  [window addSubview:rootController.view];

  activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  [activityIndicator setCenter:CGPointMake(160, 200)];
  [window addSubview:activityIndicator];

  [window makeKeyAndVisible];
}

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

- (void)parseXMLFileAtURL:(NSString *)URL {
  NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

  AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

  NSLog(@"parseXMLFileAtURL started.");
  [appDelegate.activityIndicator startAnimating];
  NSLog(@"appDelegate.activityIndicator: %@", appDelegate.activityIndicator);

  articles = [[NSMutableArray alloc] init];

  NSURL *xmlURL = [NSURL URLWithString:URL];

  rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
  [rssParser setDelegate:self];
  [rssParser setShouldProcessNamespaces:NO];
  [rssParser setShouldReportNamespacePrefixes:NO];
  [rssParser setShouldResolveExternalEntities:NO];
  [rssParser parse];

  NSLog(@"parseXMLFileAtURL finished.");
  [appDelegate.activityIndicator stopAnimating];

  [apool release];
}

Этот метод вызывается каждым контроллером представления следующим образом:

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

  if ([articles count] == 0) {
    NSString *path = @"http://www.myproject.com/rss1.xml";
    [self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path];
  }
}

Это прекрасно работает, пока приложение загружает содержимое первой вкладки. Мне преподносят пустой стол и счетчик. Как только содержимое загружается, спиннер уходит.

Странно, когда я щелкаю вторую вкладку, сообщения NSLog от -parseXMLFileAtURL: метода отображаются в журнале, но экран зависает в представлении первой вкладки, и я не вижу счетчик. Как только загрузка контента будет завершена, появится представление второй вкладки.

Я подозреваю, что это как-то связано с потоками, с которыми я все еще знакомлюсь. Я делаю что-то явно не так?

1 Ответ

3 голосов
/ 24 марта 2010

Вы должны выполнить все действия с индикатором активности в главном потоке, используя:

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