objective-c - 可以在后台线程上创建 UIView 吗?

标签 objective-c ios uiview uiviewcontroller nsthread

我知道 UIView 不是线程安全的,所以我不能在后台线程上添加 View ,要解决这个问题,可以在后台线程上创建 UIView 然后将它添加到主线程吗?

注意:我没有在主线程上执行此操作的原因是因为我的实际代码要复杂得多,因此需要一些时间来创建所有 View 并填充值。我不希望 UI 在执行此操作时变得无响应,因此我正在尝试解决此问题。

例如..

-(void)addLabel//called on background thread
{
    UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0,0,40,100)];
    [label setText:@"example"]
    [self.view performSelector:@selector(addSubview:) onThread:[NSThread mainThread] withObject:example waitUntilDone:YES];
}

提前致谢。

最佳答案

来自 UIView :

Threading Considerations

Manipulations to your application’s user interface must occur on the main thread. Thus, you should always call the methods of the UIView class from code running in the main thread of your application. The only time this may not be strictly necessary is when creating the view object itself but all other manipulations should occur on the main thread.

initWithFrame: 的调用显然不是线程安全的。对 setText: 的调用可能不是线程安全的,属于“操作”子句。这些当然没有 promise 是线程安全的。

在后台线程中找出数据。然后在主线程上创建您的 View 。如果有大量 View ,您可以尝试使用对主队列的多个 dispatch_async() 调用来拆分工作。这可能会让 UI 保持响应;我还没有对它进行广泛的试验。

您可能还需要考虑尽可能从 UIView 切换到 CALayer。大多数 CALayer 工作都可以在后台线程上完成。如果您有大量的 View ,那可能无论如何都是低效的。如果只是需要很长时间来计算 View 的数据,则表明您没有正确分离模型和 View 信息。模型类应该独立于创建 View 计算所需的一切。

关于objective-c - 可以在后台线程上创建 UIView 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122957/

相关文章:

objective-c - 如何在 Mac 上调试 VLC?

objective-c - 分组 TableView ——节间距

ios - UICollectionViewCell 选择时双倍大小

ios - 如何在 Objective-C 中从右上角淡入和展开模态框

ios - UIView 透明度会影响应用程序的性能吗?

ios - NSObject 类标签的连续更新值

ios - 未安装应用程序时如何检查 Firebase 深层链接?

ios - CFUserNotificationDisplayAlert CFOptionFlags 不工作?

ios - 仅在第一周允许完全访问应用程序

ios - 是否可以将大框架的uiview添加到小框架的uiview中