繁体   English   中英

在非主线程上添加子视图不显示

[英]Adding subViews on non-main Thread not displaying

我创建一个UIView contentView并显示它。 然后,我从服务器获取数据并创建一堆显示数据的子视图。 我正在使用MBProgressHUD在等待数据时显示。

if (datasetSubBar.panels == nil) {
    MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:datasetSubBar.filterListView animated:YES];

    HUD.labelText = @"Creating Panels";

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        [datasetSubBar createPanels];

        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:datasetSubBar.filterListView animated:YES];
        });
    });
}

createPanels方法中,我获取数据,然后创建面板。 创建面板,将其添加到filterListView(内容视图),然后添加约束:

for (int i = 0; i < panels.count; i++) {
    NSLog(@"thread: %@", [NSThread currentThread]);

    NSDate *startDate = [NSDate date];

    DatasetFilterListPanelView *panel = [panels objectAtIndex:i];

    [contentView addSubview:panel];

    // add constraints to position each panel
}

这些都是在单独的线程上运行的,这是我认为的问题所在。 UI只能在主线程上更新。

我尝试添加:

dispatch_async(dispatch_get_main_queue(), ^{
    [contentView addSubview:panel];
});

但这会导致约束错误(约束没有引用它,因为它在不同的线程中)。

如果我在主线程上运行createPanels ,将显示面板,但也会锁定UI直到完成。

有任何想法吗?

我不确定违反了哪些约束,但您也可以尝试:

[contentView performSelctorOnMainThread:@selector(addSubview) withObject:panel waitUntilDone:YES];

代替

dispatch_async(dispatch_get_main_queue(), ^{
    [contentView addSubview:panel];
});

不确定这是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM