我正在尝试在上传文件时制作活动指示器,所以我找到了很多解决方案,但我想我并不完全理解它们,所以我的代码看起来像这样:
- (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]它根本没有出现。请帮我找出错误。
答案 0 :(得分:4)
您正在对不是主线程的线程执行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在方法范围之外声明。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
当你在startSpinner方法中声明局部变量微调器时,就会发生这种情况。
当你调用self.spinner时,它不会影响你在startSpinner方法中声明的局部变量微调器。你有2个具有相同名称的独立变量。
您必须声明
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];