0

得到这个代码:

[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

4 回答 4

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];
        });
    }
};
于 2012-11-06T04:22:33.870 回答
1

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

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

希望有帮助!

于 2012-11-06T04:11:29.397 回答
0

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

于 2012-11-06T04:07:32.103 回答
0

只需在块后添加此代码

 [self.activityIndicator stopAnimating];
于 2012-11-06T04:22:14.510 回答