2

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

- (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] 它根本不会出现。请帮我找出错误。

4

3 回答 3

4

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

一个更好、更容易理解的方法是:

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 在方法范围之外声明。

于 2013-02-05T08:07:27.727 回答
1

它发生在您在 startSpinner 方法中声明局部变量微调器。

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

你必须声明

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

于 2013-02-05T08:08:31.780 回答
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;
} 
于 2013-02-05T08:07:00.880 回答