iPhone上的NSThread问题

时间:2010-08-18 14:58:17

标签: iphone nsthread

我是第一次在iPhone应用程序中使用两个线程而且我遇到了问题。在这个原型中,我有一个加载本地网页的视图控制器。我想要一个活动指示器显示,直到页面加载完毕。使用下面的代码,活动指示器启动,页面正确加载,但活动指示器不会停止或隐藏。它似乎不会被称为“加载”函数。

我做错了什么?

- (void)viewDidLoad {
 [self.view addSubview:activityIndicator];
 [activityIndicator startAnimating];
 [NSThread detachNewThreadSelector:@selector(getData) toTarget:self withObject:nil];
 [super viewDidLoad];
}
- (void)getData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [detailWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"page1" ofType:@"html"]isDirectory:NO]]];
 [NSTimer scheduledTimerWithTimeInterval: (1.0/2.0) target:self selector:@selector(loading) userInfo:nil repeats:YES];
 [pool release];
}
- (void)loading {
 if(!detailWebView.loading){
 [activityIndicator stopAnimating];
 [activityIndicator removeFromSuperview];
 }

4 个答案:

答案 0 :(得分:2)

如果不创建自己的主题,有一种更简单的方法。

- (void)viewDidLoad {
    [self.view addSubview:activityIndicator];
    [activityIndicator startAnimating];
    [detailWebView setDelegate:self];
    [detailWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"page1" ofType:@"html"]isDirectory:NO]]];
    [super viewDidLoad];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [activityIndicator stopAnimating];
}

答案 1 :(得分:1)

您可以在webview委托方法中停止活动指示器:

-(void)webViewDidFinishLoad:(UIWebView*)webView

答案 2 :(得分:0)

您是否已将调试输出添加到loading以确定是否被调用?代码看起来确实如此,它应该在0.5秒后被调用,我猜想detailWebView仍在加载。

此外,GUI内容应该在主线程上运行,因此您可能需要执行以下操作:

- (void)loading {
  if(!detailWebView.loading){
    [activityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
    [activityIndicator performSelectorOnMainThread:@selector(removeFromSuperView) withObject:nil waitUntilDone:YES];
  }
}

答案 3 :(得分:0)

您正在使用webview,它已经提供了一种机制来了解负载何时完成,并且已经异步加载数据 - 实际上不需要使用自定义线程。

将您的对象注册为UIWebView的委托。在UIWebView上调用loadRequest并开始设置进度指示器的动画。停止在以下位置设置进度指示器的动画:

-(void)webViewDidFinishLoad:(UIWebView*)webView

此方法由UIWebViewDelegate协议定义 - 确保您的对象实现此协议。您实现此方法:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [activityIndicator stopAnimating];
}

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html