Я создаю UIView contentView и покажу его. Затем я извлекаю данные с сервера и создаю кучу суб-представлений, отображающих данные. Я использую MBProgressHUD для отображения во время ожидания данных.Добавление subViews на основной поток, не отображающий
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
}
они выполняются в отдельном потоке, который является то, что я считаю, что вопрос. Пользовательский интерфейс может обновляться только в основном потоке.
Я попытался добавить:
dispatch_async(dispatch_get_main_queue(), ^{
[contentView addSubview:panel];
});
Но что вызывает ошибки для ограничений (ограничения не имеют ссылки на него, так как его в другом потоке).
Если я запустил createPanels
в основной теме, панели отобразятся, но также заблокирует пользовательский интерфейс до его завершения.
Любые идеи?
Сколько панелей вы добавляете, что они подавляют основной поток? Может быть, UITableView и cell будут лучше, чем «панельные», потому что они ленивы загружены? –
Настольный вид был бы приятным, но это 2 колонки в портрете и 3 колонны в ландшафте. Мы хотим, чтобы иметь возможность использовать столько, сколько экрана, как мы можем – Padin215
Вы пытались добавить ограничения внутри того же блока, что и '[contentView addSubView: panel]'? –