我正在尝试向我的应用添加旋转活动指示器(UIActivityIndicatorView),同时解析来自互联网的数据。我有一个IBOutlet(微调器)连接到IB中的UIActivityIndicatorView。最初我把它设置成这样:
-
(void) function {
self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
self.spinner.hidesWhenStopped = YES;
[spinner startAnimating];
//parse data from internet
[spinner stopAnimating];}
但旋转器不会旋转。我读到它与同一个线程上的所有内容有关。所以我尝试了这个:
- (void) newFunction {
self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
self.spinner.hidesWhenStopped = YES;
[spinner startAnimating];
[NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
[spinner stopAnimating];}
但仍然没有运气。有任何想法吗?感谢。
答案 0 :(得分:8)
您的newFunction:
方法应如下所示:
- (void) newFunction {
self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
self.spinner.hidesWhenStopped = YES;
[NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
}
您的function
方法应如下所示:
- (void) function {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self.spinner performSelectorOnMainThread:@selector(startAnimating) withObject:nil waitUntilDone:NO];
//...
[self.spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];
[pool drain];
}
答案 1 :(得分:0)
你不应该再次初始化指标。请用这个替换你的代码。
-(void) function {
[spinner startAnimating];
[self performSelector:@selector(newfunction) withObject:nil afterDelay:3.0];
}
- (void) newfunction {
[spinner stopAnimating];
}
感谢。
答案 2 :(得分:0)
只需看到“来自互联网的//解析数据”是同步的或异步的。异步意味着一个单独的线程将从该点开始,并且当前的函数执行将继续而没有延迟。
在第二个示例中,您明确地创建了单独的线程,这意味着@selector(function)
将在单独的线程上发生,并且下一个语句[spinner stopAnimating]
将立即执行。所以,看起来旋转器根本就不会旋转。
此外,请确保仅在主线程上启动和停止活动指示器。