Ios UILabel未使用线程立即显示

Ios UILabel未使用线程立即显示,ios,objective-c,uiview,uilabel,grand-central-dispatch,Ios,Objective C,Uiview,Uilabel,Grand Central Dispatch,我想在线程中加载一些视图,以避免UI冻结等待加载结束 我不习惯穿线,所以我做了一个快速测试。我的代码只是尝试在线程中创建视图,并在主线程的当前viewcontroller视图中添加这些视图 我的UIView正在工作,但对于我的UILabel,我必须等待20-60秒才能将其显示在屏幕上 我使用UIButton进行测试,在这种情况下,按钮立即显示,但按钮内的标签显示的延迟与UILabel相同 让它按我所希望的方式工作的唯一方法是添加一个[lbl setNeedsDisplay];在主线程中,强制立即

我想在线程中加载一些视图,以避免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);

还应在主队列上设置标签的文本:

dispatch_async( dispatch_get_main_queue(), ^{
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 48)]
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    lbl.text = @"FOO";
    [self.view addSubview:lbl];
    [self.view addSubview:view];
});
最好将所有UI内容保留在主队列中

更新


它显示为
initWithFrame:
不是线程安全的(可在上找到,另请参见
UIView
文档中)。

它不是这样工作的。我仍然必须使用[lbl setNeedsDisplay];我们无法在带有返回键的评论中创建新行?很抱歉,我的第一个答案似乎有效。我不得不删除lbl.text=@“FOO”;也在线程中。我认为他在UILabel中检测到相同文本的赋值,并且不强制刷新。但是我不明白为什么它不能与uilable一起工作,而与uiview一起工作?谢谢,迈克,但是在你的更新中,我不再有后台代码了。也许我错过了一些东西,因为我是一个线程新手。@Alex如果你所做的只是创建这样的视图,我想你不会注意到保持在主线程上会影响性能。一般的规则是,如果它在UI上,它就在主线程上。创建UIView的任务并不重要,您不需要在其他线程中执行。我正在尝试制作日历。在这个日历中,我在6x7的网格中每天有42个按钮,如果有活动,我必须在每天下面有一个点。我添加了带有CALayer的点作为day按钮的子层,在月与月之间的过渡期间,我有一些延迟显示。当我寻找这个延迟的原因时,它似乎来自addSubLayer。所以我想在init的后台添加这个子层,并将其隐藏在主线程中。如果你对此有一些想法,我听你说:-)@zakhej如果计划进行一些体面到繁重的数据处理,那就是。我建议向我们展示你用来计算视图的代码。这就是你拖延的地方。添加子视图通常不会给您这种延迟。我做过类似的日历视图,没有遇到过这个问题。@sosborn当我只注释这一行[self.layer addSublayer:layer]时;延迟消失了。我保留代码来创建子层。所以我认为它来自这里。你怎么做你的圆点?CALayer,UIImageView?