我写了一个小测试应用程序,但是没有用。这是我的故事板: 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
怎么了?
答案 0 :(得分:3)
这是解决了同样的问题:
[spinner startAnimating];
dispatch_async(kBgQueue, ^{
// ... do other stuff in the background
dispatch_async(dispatch_get_main_queue(), ^{
[spinner stopAnimating];
});
});
答案 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
(您可以将其添加到主队列并解决这两个问题)。