Я разрабатываю приложение для 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: метода отображаются в журнале, но экран зависает в представлении первой вкладки, и я не вижу счетчик. Как только загрузка контента будет завершена, появится представление второй вкладки.
Я подозреваю, что это как-то связано с потоками, с которыми я все еще знакомлюсь. Я делаю что-то явно не так?