0

我有一个视图控制器,它加载一个自定义视图(它反过来绘制 UI 元素,然后生成一个线程在后台做一些事情。

如果“在后台运行的东西”遇到错误,我的视图控制器会捕获它,此时我想更改 UI 元素,例如 bgcolor 或添加新标签。

但是我所做的任何更改都没有显示出来。这就是我正在尝试的:

[self performSelectorOnMainThread:@selector(onCompleteFail) withObject:nil waitUntilDone:YES];

- (void)onCompleteFail
{ 

  NSLog(@"Error: Device Init Failed");

  mLiveViewerView.backgroundColor= [UIColor whiteColor];
  //self.view.backgroundColor = [UIColor whiteColor];
  UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 200, 30)];
  tmpLabel.text = @"Failed to init";
  [self.view addSubview:tmpLabel];
}
4

1 回答 1

1

您需要在主线程上进行任何与 UI 相关的调用:UIKit 不是线程安全的,并且您会看到各种奇怪的行为,就好像它是线程安全的一样。这可能就像从

[self onCompleteFail];

[self performSelectorOnMainThread:@selector(onCompleteFail) withObject:nil waitUntilDone:NO];

…或者如果-onCompleteFail由于其他原因必须在后台线程上调用,您可以将 UI 调用包装到主队列的调度中,如下所示:

- (void)onCompleteFail
{ 
    NSLog(@"Error: Device Init Failed");
    dispatch_async(dispatch_get_main_queue(), ^{
          mLiveViewerView.backgroundColor= [UIColor whiteColor];
          //self.view.backgroundColor = [UIColor whiteColor];
          UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 200, 30)];
          tmpLabel.text = @"Failed to init";
          [self.view addSubview:tmpLabel];
    });
}
于 2013-11-06T03:32:35.520 回答