0

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 がロックされます。

何か案は?

4

1 に答える 1

0

どの制約に違反しているかはわかりませんが、次のことを試すこともできます。

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

それ以外の

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

これが役立つかどうかわからない。

于 2013-02-28T20:34:41.963 に答える