0

アプリで MBProgressHUD ライブラリを使用していますが、大量のデータをクエリしたり、データの処理が終了した直後に表示されたりしても、進行状況の HUD が表示されない場合があります (その時点では表示されません)。 hud をもう表示する必要があります)。

別の投稿で、UI の実行サイクルがビジー状態で完全に更新できない場合があることがわかったので、問題を部分的に解決するソリューションを使用しました。すべてのリクエストで HUD が上昇しますが、ほぼ半分の回数でアプリがクラッシュします。 . なんで?助けが必要なところです。

私はテーブルビューを持っています.didSelectRowAtIndexPathデリゲートメソッドには次のコードがあります:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    [NSThread detachNewThreadSelector:@selector(showHUD) toTarget:self withObject:nil];
    ...
}

次に、次の方法があります。

- (void)showHUD {
    @autoreleasepool {
        [HUD show:YES];
    }
}

別の時点で、次のように呼び出します。

[HUD hide:YES];

そして、それが機能すると、hud が表示され、期待どおりに表示されたままになり、その後消えます。また、アプリケーションがクラッシュすることもあります。エラー: EXC_BAD_ACCESS 。なんで?

ちなみに、HUD オブジェクトはすでに viewDidLoad に割り当てられています。

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    // Allocating HUD
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
    [self.navigationController.view addSubview:HUD];

    HUD.labelText = @"Checking";
    HUD.detailsLabelText = @"Products";
    HUD.dimBackground = YES;
}
4

1 に答える 1

0

別のスレッドで処理を実行する必要があります。そうしないと、処理が完了するまで MBProgressHud の描画がブロックされ、その時点で MBProgressHud は再び非表示になります。

NSThread は、処理を単にオフロードするには低レベルすぎます。Grand Central Dispatch または NSOperationQueue のいずれかをお勧めします。

http://jeffreysambells.com/2013/03/01/asynchronous-operations-in-ios-with-grand-central-dispatch http://www.raywenderlich.com/19788/how-to-use-nsoperations-and -ns 操作キュー

/* Prepare the UI before the processing starts (i.e. show MBProgressHud) */

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   /* Processing here */

   dispatch_async(dispatch_get_main_queue(), ^{
      /* Update the UI here (i.e. hide MBProgressHud, etc..) */     
   });
}); 

このスニペットを使用すると、別のスレッドに処理をディスパッチする前に、メイン スレッドで UI 作業を行うことができます。処理が完了するとメイン スレッドに戻り、UI を更新できるようになります。

于 2013-10-09T13:20:06.550 に答える