ActivityIndi​​cator在计算后不会停止

时间:2013-02-05 08:04:33

标签: ios objective-c cocoa-touch uiactivityindicatorview

我正在尝试在上传文件时制作活动指示器,所以我找到了很多解决方案,但我想我并不完全理解它们,所以我的代码看起来像这样:

- (void) startSpinner {

UIActivityIndicatorView  *spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[spinner setCenter:CGPointMake(self.view.frame.size.width/2.0, self.view.frame.size.height/2.0)];
[self.view addSubview:spinner];
[spinner startAnimating];

}


- (void)startSync {

[NSThread detachNewThreadSelector:@selector(startSpinner) toTarget:self withObject:nil];

// computations 

[self.spinner stopAnimating];
} 

所以在我做[self startSync]后会出现activityIndi​​cator,但上传之后并没有停止。此外,如果我在其他地方声明活动指示符(不在(void)startSpinner中),例如在viewDidLoad中,并且只执行[self startAnimating]它根本没有出现。请帮我找出错误。

3 个答案:

答案 0 :(得分:4)

您正在对不是主线程的线程执行UI操作。 您永远不应该使用执行UI相关任务的选择器来调用detachNewThreadSelector

更好,更易理解的方法是:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.activityIndicator startAnimating];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //Perform lengthy operations
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.activityIndicator stopAnimating];
        });
    });
});

此外,如果您选择使用选择器 - 请确保您的UIActivityIndi​​catorView在方法范围之外声明。

答案 1 :(得分:1)

- (void) startSpinner
{
    self.spinner = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [spinner setCenter:CGPointMake(self.view.frame.size.width/2.0, self.view.frame.size.height/2.0)];
    [self.view addSubview:spinner];
    [spinner startAnimating];
}


- (void)startSync
{
    [NSThread detachNewThreadSelector:@selector(startSpinner) toTarget:self withObject:nil];

    // computations 

    [self.spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];
    self.spinner = nil;
} 

答案 2 :(得分:1)

当你在startSpinner方法中声明局部变量微调器时,就会发生这种情况。

当你调用self.spinner时,它不会影响你在startSpinner方法中声明的局部变量微调器。你有2个具有相同名称的独立变量。

您必须声明

spinner = [[UIActivityIndi​​catorView alloc] initWithActivityIndi​​catorStyle:UIActivityIndi​​catorViewStyleGray];