iOS:在加载第二个视图控制器时使用活动指示器

时间:2015-03-09 07:02:58

标签: ios objective-c uiactivityindicatorview

我有两个视图控制器;在第二个视图中,处理了一堆数据需要花费很多时间,而在第一个视图中,有一个按钮导航到第二个。我想在点击按钮后立即在第二个视图中显示进程的活动指示器。但是在第二个视图中初始化UIActivityIndicatorView似乎不起作用。单击按钮时没有显示任何内容,并且在处理数据时应用程序卡在第一个视图中。

以下是我在viewDidLoad中在第二个视图控制器中编写的代码。

_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)];
[self.view addSubview:_activityIndicator];

...............

[_activityIndicator startAnimating];

...............
// data processing

[_activityIndicator stopAnimating];

任何人都知道如何解决这个问题?

====== EDIT ======

非常感谢您的建议。现在我尝试使用NSThread,但是旋转器很晚才出现。这是我在第一个视图控制器中编写的代码。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // activity indicator
    _activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/4, SCREEN_HEIGHT/4)];
    [self.view addSubview:_activityIndicator];
}

- (IBAction)startButtonClicked:(id)sender
{
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
}

-(void)threadStartAnimating:(id)data
{
    NSLog(@"start");
    [_activityIndicator startAnimating];
    [self performSelectorOnMainThread:@selector(threadStopAnimating:) withObject:nil waitUntilDone:YES];
}


-(void)threadStopAnimating:(id)data
{
    NSLog(@"stop");
    [_activityIndicator stopAnimating];
}

旋转器在NSLog(@"start");被执行后约2秒出现,并在很短的时间内出现。我将- (IBAction)startButtonClicked:(id)sender与导航到第二个视图的按钮相关联。 有没有更好的方法来放置[_activityIndicator startAnimating];

1 个答案:

答案 0 :(得分:2)

也许您可以尝试使用Grand Central Dispatch(线程)解决此问题。

在第二个VC中,请尝试以下代码:

- (void) viewDidLoad{
[super viewDidLoad];

// Main thread
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[_activityIndicator setCenter:CGPointMake(SCREEN_WIDTH/4, SCREEN_HEIGHT/4)];
[self.view addSubview:_activityIndicator];
[_activityIndicator startAnimating];

// create a queue
dispatch_queue_t queue = dispatch_queue_create("data_process", 0);

// send a block to the queue - Not in Main thread
dispatch_async(queue, ^{
// data processing
.................

    // Interaction with User Interface - Main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        [_activityIndicator stopAnimating];
        _activityIndicator.hidden = YES;
    });
});
}

我希望这会有所帮助。