performSelectorOnMainThreadを使用してUIを更新する際に問題が発生しました。ここに私の状況があります。私のviewDidLoadでは、アクティビティインジケータとラベルを設定しました。次に、セレクタを呼び出してサーバーからデータを取得します。次に、遅延の後にUIを更新するセレクタを呼び出します。ここでは、コードは次のとおり目的C-メインスレッドの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を更新しようとしていない理由を私に説明することはできますか?
することができます[GCD](http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html)を使用して、他のスレッドにデータをディスパッチし、メインスレッドのUIを更新します。 NSThreadを使用するよりも優れています。 – johnMa