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 がロックされます。
何か案は?