iOS:导航栏中的UIActivityIndi​​cator没有停止

时间:2014-07-25 08:30:31

标签: ios grand-central-dispatch nsthread uiactivityindicatorview

我写了一个小测试应用程序,但是没有用。这是我的故事板: storyboard http://cs618122.vk.me/v618122477/dc8d/Z9DffvZC3RY.jpg

这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIActivityIndicatorView* ai = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    UIBarButtonItem* rightButton = [[UIBarButtonItem alloc] initWithCustomView:ai];
    self.navigationItem.rightBarButtonItem = rightButton;
    [ai startAnimating];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [NSThread sleepForTimeInterval: 5];
        NSLog(@"STOP!");
        [ai stopAnimating];
    });
}

这是工作结果: work result http://cs618122.vk.me/v618122477/dc84/Wim1wkPYnEw.jpg

怎么了?

4 个答案:

答案 0 :(得分:3)

这是解决了同样的问题:

[spinner startAnimating];
dispatch_async(kBgQueue, ^{
    // ... do other stuff in the background
    dispatch_async(dispatch_get_main_queue(), ^{
        [spinner stopAnimating];
   });
}); 

UIActivityIndicatorView won't stop

答案 1 :(得分:2)

你试过吗?

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [ai stopAnimating];
});

答案 2 :(得分:1)

所有用户界面更新必须在主线程(mainQueue)上运行:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
        [ai stopAnimating];
    }];

答案 3 :(得分:1)

所有UI更新必须在主线程上运行,并且您在后台线程上运行停止。

另外,不要启动后台线程然后再将其休眠。使用不同的API来运行延迟函数,例如计时器或dispatch_after(您可以将其添加到主队列并解决这两个问题)。