我创建了一个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直到完成。
有什么想法吗?
答案 0 :(得分:0)
我不确定违反了哪些约束,但您也可以尝试:
[contentView performSelctorOnMainThread:@selector(addSubview) withObject:panel waitUntilDone:YES];
而不是
dispatch_async(dispatch_get_main_queue(), ^{
[contentView addSubview:panel];
});
不确定这是否会有所帮助。