ios - Objective-C - 无法在主线程上更新 UI

标签 ios objective-c user-interface

我在使用 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 时,事件指示器会一直旋转,标签文本不会更改,并且选择器 View 不会重新加载其内容。有人可以向我解释为什么我使用的方法无法在主线程上更新我的用户界面吗?

最佳答案

dispatch_async(dispatch_get_global_queue(0, 0), ^{
 //load your data here.
 dispatch_async(dispatch_get_main_queue(), ^{
                //update UI in main thread.
            });
});

关于ios - Objective-C - 无法在主线程上更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590802/

相关文章:

ios - iTunes Connect 附上一份证明权利的契约(Contract)

iOS 6 无法检查仅包含字母数字字符的字符串

iphone - 无法在 iphone 上转换字节数组

ios - 停止 UISearchBar 使用 UITableView 滚动

c# - 为什么 Thread.Sleep() 会卡住表单?

ios - React Native StatusBar 大小

ios - “此时无法安装此应用程序”错误 Xcode

iphone - 如何停止 UIScrollView 调用 drawRect : on sublayers that go in/out of the visible region?

ios - 我必须为 iPhone 4S 和 5 创建两个 View 吗

java - 如何修复此代码以便我可以将此 JFreeChart 添加到面板中