我正在开发一款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];
}
由于我的标签都执行了类似的功能,因此我创建了一个基类,我的所有标签的ViewControllers都继承自该类。这是我用来进行远程检索的方法:
- (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];
}
}
当应用程序加载第一个标签的内容时,这很有效。我看到了空桌子和旋转器。一旦内容加载,微调器就会消失。
奇怪的是,当我单击第二个选项卡时,来自-parseXMLFileAtURL:方法的NSLog消息显示在日志中,但是屏幕挂起在第一个选项卡的视图上,我看不到微调器。内容下载完成后,第二个标签的视图就会出现。
我怀疑这与线程有关,我仍然熟悉它。我在这里做了一些明显不对的事吗?
答案 0 :(得分:3)
您应该使用以下命令对主线程上的活动指示器执行所有操作:
performSelectorOnMainThread:withObject:waitUntilDone: