2013-02-28 4 views
0

Я создаю 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 в основной теме, панели отобразятся, но также заблокирует пользовательский интерфейс до его завершения.

Любые идеи?

+0

Сколько панелей вы добавляете, что они подавляют основной поток? Может быть, UITableView и cell будут лучше, чем «панельные», потому что они ленивы загружены? –

+0

Настольный вид был бы приятным, но это 2 колонки в портрете и 3 колонны в ландшафте. Мы хотим, чтобы иметь возможность использовать столько, сколько экрана, как мы можем – Padin215

+0

Вы пытались добавить ограничения внутри того же блока, что и '[contentView addSubView: panel]'? –

ответ

0

Я не уверен, где нарушаются ограничения, но вы также можете попробовать:

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

вместо

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

Не уверен, будет ли это поможет.

+0

Нарушений не нарушают, iOS не пытается сломать их, чтобы сделать вид подходящим. – Padin215

Смежные вопросы