为什么我的UIActivityIndi​​catorView只显示一次?

时间:2010-03-24 13:39:02

标签: iphone iphone-sdk-3.0

我正在开发一款iPhone应用程序,其中包含一个带有五个标签的基于标签栏的导航。每个选项卡都包含一个UITableView,其远程检索数据。理想情况下,我想使用在远程检索期间启动/停止的单个UIActivityIndi​​catorView(窗口的子视图) - 每个选项卡一次。

以下是我在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消息显示在日志中,但是屏幕挂起在第一个选项卡的视图上,我看不到微调器。内容下载完成后,第二个标签的视图就会出现。

我怀疑这与线程有关,我仍然熟悉它。我在这里做了一些明显不对的事吗?

1 个答案:

答案 0 :(得分:3)

您应该使用以下命令对主线程上的活动指示器执行所有操作:

performSelectorOnMainThread:withObject:waitUntilDone: