UI 更新 NSThread

UI update on NSThread

我创建了一个 NSThread 来更改 textField 的文本,我确保 NSThread 不是主要的 thread.Though,textField'text changed.Shouldn' UI 更新必须在主线程上?

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextField *textField;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(changeText) object:nil];
    NSLog(@"%@ %d",thread,[thread isMainThread]);
    [thread start];
}

- (void)changeText {
    self.textField.text = @"this is thread";
}

如果您从非主线程的线程进行 UI 调用,则结果是不确定的。它可能有效,也可能无效。有时它甚至会使您的应用程序崩溃。不要那样做。

另一个问题:

您在新线程上运行的代码不会创建自动释放池,因此您创建的任何对象都可能被泄露。

检查你的日志,它实际上为你创建了警告。

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.

是的,到目前为止它可能有效,但是当应用程序变得复杂时它会导致崩溃或其他不可预测的结果。

如果您在后台线程中更新 UI.. 它可能工作或可能不工作取决于主 thread.At 的负担,任何时候它都可能导致崩溃。所以为了安全 UI 相关的更新应该只在 MainThread 上。