活动指标在阻止后继续

时间:2012-11-06 04:03:24

标签: objective-c ios

得到了这段代码:

[self setQRCodeScannerMode:false];
[self.activityIndicator startAnimating];
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {
    if ([[TBXML elementName:tbxmlDocument.rootXMLElement] isEqualToString:@"xxxxxx"]){
        [self setQRCodeScannerMode:true];
    } else {
        [self setQRCodeScannerMode:true];
    }
};

问题是当我在方法[setQRCodeScannerMode]中将扫描模式设置为true时,我正在停止活动指示器。 但是惊喜!!!几秒钟后,活动指示器仍在工作并且弄乱我的视线。

我该怎么办?

4 个答案:

答案 0 :(得分:2)

您需要在完成块中停止活动指示器:

[self setQRCodeScannerMode:false];
[self.activityIndicator startAnimating];
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {
    if ([[TBXML elementName:tbxmlDocument.rootXMLElement] isEqualToString:@"xxxxxx"]){
        [self setQRCodeScannerMode:true];
    } else {
        [self setQRCodeScannerMode:true];
    }

    [self.activityIndicator stopAnimating];
};

这假设在主线程上调用了完成块。如果无法保证在主线程上调用完成块,则可以执行以下操作:

[self setQRCodeScannerMode:false];
[self.activityIndicator startAnimating];
TBXMLSuccessBlock successBlock = ^(TBXML *tbxmlDocument) {
    if ([[TBXML elementName:tbxmlDocument.rootXMLElement] isEqualToString:@"xxxxxx"]){
        [self setQRCodeScannerMode:true];
    } else {
        [self setQRCodeScannerMode:true];
    }

    if ([NSThread isMainThread]) {
        [self.activityIndicator stopAnimating];
    } else {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.activityIndicator stopAnimating];
        });
    }
};

答案 1 :(得分:1)

你应该调用[self.activityIndi​​cator stopAnimating];在你完成它之后,如果那不适合你,试试这个!

[self.activityIndicator performSelector:@selector(stopAnimating) withObject:nil afterDelay:0.1];

希望有帮助!

答案 2 :(得分:0)

您可以做的一件事是在不同的线程上使用指标,即不在主线程上。您可以使用NSOperationQueue和NSInvocationOperation

答案 3 :(得分:0)

只需在块

之后添加此代码即可
 [self.activityIndicator stopAnimating];