我想在线程中加载一些视图以避免UI冻结等待加载结束.
我不习惯穿线,所以我做了一个快速测试.我的代码只是尝试在线程中创建视图,并在主线程的当前viewcontroller视图中添加此视图.
我的UIView正在工作,但对于我的UILabel,我必须等待20-60秒才能将它放在屏幕上.
我使用UIButton进行测试,在这种情况下,按钮会立即显示,但按钮内的标签显示的延迟与我的UILabel相同.
让它按我想要的方式工作的唯一方法是添加一个[lbl setNeedsDisplay]; 在主线程中强制UILabel立即显示.为什么?没有这条线可以完成这项工作吗?
dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL);
dispatch_async(queue, ^{
// NEW THREAD
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 48)];
lbl.text = @"FOO";
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
view.backgroundColor = [UIColor redColor];
// MAIN THREAD
dispatch_async(dispatch_get_main_queue(), ^{
[self.view addSubview:lbl];
[lbl setNeedsDisplay]; // Needeed to see the UILabel. WHY???
[self.view addSubview:view];
});
});
dispatch_release(queue);
Run Code Online (Sandbox Code Playgroud)