我在使用performSelectorOnMainThread更新我的UI时遇到了一些麻烦.这是我的情况.在我的viewDidLoad中,我设置了一个活动指示器和一个标签.然后我调用选择器从服务器检索一些数据.然后我调用选择器在延迟后更新UI.这是代码:
- (void)viewDidLoad { [super viewDidLoad]; self.reloadSchools = [[UIAlertView alloc] init]; self.reloadSchools.message = @"There was an error loading the schools. Please try again."; self.reloadSchools.title = @"We're Sorry"; self.schoolPickerLabel = [[UILabel alloc]init]; self.schoolPicker = [[UIPickerView alloc] init]; self.schoolPicker.delegate = self; self.schoolPicker.dataSource = self; self.server = [[Server alloc]init]; schoolList = NO; _activityIndicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [self.view addSubview:_activityIndicator]; [self.view bringSubviewToFront:_activityIndicator]; [_activityIndicator startAnimating]; [NSThread detachNewThreadSelector: @selector(getSchoolList) toTarget: self withObject: nil]; [self performSelector:@selector(updateUI) withObject:nil afterDelay:20.0]; }
选择器updateUI检查数据是否被检索,并调用主线程上的选择器以相应地更新UI.以下是这些部分的代码:
-(void)updateUI { self.schools = [_server returnData]; if(!(self.schools == nil)) { [self performSelectorOnMainThread:@selector(fillPickerView) withObject:nil waitUntilDone:YES]; } else { [self performSelectorOnMainThread:@selector(showError) withObject:nil waitUntilDone:YES]; } } -(void)showError { NSLog(@"show error"); [_activityIndicator stopAnimating]; [self.reloadSchools show]; } -(void)fillPickerView { NSLog(@"fill picker view"); schoolList = YES; NSString *schoolString = [[NSString alloc] initWithData:self.schools encoding:NSUTF8StringEncoding]; self.schoolPickerLabel.text = @"Please select your school:"; self.shoolArray = [[schoolString componentsSeparatedByString:@"#"] mutableCopy]; [self.schoolPicker reloadAllComponents]; [_activityIndicator stopAnimating]; }
当调用选择器fillPickerView时,活动指示器保持旋转,标签文本不会更改,并且选取器视图不会重新加载其内容.有人可以向我解释为什么我使用的方法不能在主线程上更新我的ui吗?
dispatch_async(dispatch_get_global_queue(0, 0), ^{ //load your data here. dispatch_async(dispatch_get_main_queue(), ^{ //update UI in main thread. }); });