在添加到视图之前在后台线程中更新 UI 元素

Posted

技术标签:

【中文标题】在添加到视图之前在后台线程中更新 UI 元素【英文标题】:Updating UI elements in a background thread before being added to a view 【发布时间】:2012-09-25 19:28:58 【问题描述】:

我只是想了解一下 Grand Central Dispatch (GCD),但我似乎无法找到答案

所以我知道,一般来说,您不应该从主线程以外的任何线程更新 UIView 元素。所以这是非法的:

dispatch_async(workerQueue, ^
    self.view.backgroundColor = [UIColor redColor];
);

但是您是否允许在视图元素实际添加到视图之前对其进行处理?换句话说,这是否允许?

dispatch_async(workerQueue, ^
    UIButton *thisLevelButton = [UIButton buttonWithType:UIButtonTypeCustom];
    thisLevelButton.frame = CGRectMake(x, y, BUTTON_WIDTH, BUTTON_HEIGHT);
    thisLevelButton.tag = kLevelButtonTags + j;


    int levelState = [[[thisCat objectForKey:[levelNamesInCat objectAtIndex:j]] objectAtIndex:4] intValue];

    [thisLevelButton setBackgroundImage:[UIImage imageNamed:@"ccLSButton50lock"]forState:UIControlStateNormal];
    thisLevelButton.alpha = 0.5;
    [thisLevelButton addTarget:self action:@selector(unlockButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    dispatch_async(dispatch_get_main_queue(), ^
        [self.view addSubview:thisLevelButton];
    

);

【问题讨论】:

【参考方案1】:

是的,你可以。最佳做法是不要更新。初始化没问题。

An example can be read in this blog post. 几乎与您正在尝试的内容一样。

【讨论】:

以上是关于在添加到视图之前在后台线程中更新 UI 元素的主要内容,如果未能解决你的问题,请参考以下文章

从后台线程添加到 UITableView 中的 UIStackView

从后台线程更新 UI 是一种不好的做法,为啥? [关闭]

WPF:在后台不断更新 UI

是否可以在后台线程中填充 ObjectListView?

在后台线程上创建一个视图,将其添加到主线程上的主视图

一种WPF在后台线程更新UI界面的简便方法