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 上。
我创建了一个 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 上。