2

我正在尝试在我的应用程序解析来自互联网的数据时添加一个旋转活动指示器 (UIActivityIndi​​catorView)。我有一个连接到 IB 中的 UIActivityIndi​​catorView 的 IBOutlet(微调器)。最初我是这样设置的:

-

 (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];}

但仍然没有运气。有任何想法吗?谢谢。

4

3 回答 3

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];
}
于 2010-12-19T03:43:15.533 回答
0

你不应该再次初始化指标。请用这个替换你的代码。

-(void) function {
    [spinner startAnimating];
    [self performSelector:@selector(newfunction) withObject:nil afterDelay:3.0];
}
- (void) newfunction {
     [spinner stopAnimating];
}

谢谢。

于 2013-08-01T06:02:30.233 回答
0

只要看到“//解析来自互联网的数据”是同步的还是异步的。异步意味着从该点开始一个单独的线程,并且当前函数执行将继续没有延迟。

在您的第二个示例中,您明确地创建了单独的线程,这意味着这@selector(function)将发生在单独的线程上,并且下一条语句[spinner stopAnimating]将立即执行。所以,看起来微调器根本没有旋转。

此外,请确保仅在主线程上启动和停止活动指示器。

于 2013-08-01T07:06:01.440 回答