ang*_*boy 6 user-interface objective-c ios
我在使用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];
}
Run Code Online (Sandbox Code Playgroud)
选择器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];
}
Run Code Online (Sandbox Code Playgroud)
当调用选择器fillPickerView时,活动指示器保持旋转,标签文本不会更改,并且选取器视图不会重新加载其内容.有人可以向我解释为什么我使用的方法不能在主线程上更新我的ui吗?
joh*_*nMa 37
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//load your data here.
dispatch_async(dispatch_get_main_queue(), ^{
//update UI in main thread.
});
});
Run Code Online (Sandbox Code Playgroud)