我试图在上传文件时制作事件指示器,所以我找到了很多解决方案,但我想我并不完全理解它们,所以我的代码如下所示:
- (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] activityIndicator 后出现,但在上传后它并没有停止。此外,如果我在其他地方(不在 (void)startSpinner 中)声明事件指示器,例如在 viewDidLoad 中,并且只执行 [self startAnimating],它根本不会出现。请帮我找出错误。
最佳答案
您正在非主线程的线程上执行 UI 操作。
您永远不应使用执行 UI 相关任务的选择器调用 detachNewThreadSelector
。
更好、更容易理解的方法是:
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];
});
});
});
此外,如果您选择使用选择器 - 请确保您的 UIActivityIndicatorView 声明在该方法的范围之外。
关于ios - ActivityIndicator 在计算后不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14702698/