3

Web サービスに接続し、カテゴリの配列を返す次のコードがあります。

SOAP Web サービスに次のラッパーを使用しています。

http://www.sudzc.com/

MBProgressHUD..そして、アクティビティ インジケーターについては次のとおりです。

https://github.com/jdg/MBProgressHUD

接続して結果を取得していることを HUD プログレス インジケーターで示したいと思います。現在、目的の効果を達成するために使用MBProgressHUDしていますが、適切に機能していないことに気付きました。my 内の実際のセルtableViewが読み込まれて表示される前に、進行状況インジケーターが消えます。またMBProgressHUD、アプリケーションのさまざまな領域で を使用しますが、通常は Web サービスに接続して結果を取得するたびに使用します。

以下のコードを修正して正しく動作させる方法について、誰かが私を正しい方向に導くことができますか? プログレス インジケーターが表示された後にコールバック メソッドが呼び出されることが関係している可能性があると思います。MBProgressHUDコールバック メソッドで適切に実装する方法がよくわかりません。

これは、それを機能させようとする私の恐ろしい試みです。

- (void)showHUD {
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];

    // Add HUD to screen.
    [self.navigationController.view addSubview:HUD];

    // Register for HUD callbacks so we can remove it from the window at the right time.
    HUD.delegate = self;

    HUD.labelText = @"Loading";

    // Show the HUD while the provided method executes in a new thread
    [HUD showWhileExecuting:@selector(runLocalNotificationHandler) onTarget:self withObject:nil animated:YES];
}

- (void)runLocalNotificationHandler {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [self performSelectorOnMainThread:@selector(connectToService) withObject:nil waitUntilDone:YES];

    [pool release];
}

- (void)connectToService {
    Service1 *service = [[Service1 alloc] init];
    [service GetCategories:self action:@selector(handlerGetCategories:)];
    [service release];
}

- (void)handlerGetCategories:(id)value {
    // parse objects returned from array, populate array, reload table view data, etc
}
4

3 に答える 3

6

MBProgressHUDコールバックが実行される状況で使用している場合は、別のアプローチがあります。バックグラウンドプロセスを開始する前に、HUDを初期化します。

MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];

それ以外の

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

次に、コールバックメソッドに次のように入力します。

[MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

このようにして、HUDがいつ表示されて閉じられるかを正確に知ることができます。少なくとも、新しいアプローチを使用した後に何が変化するかを確認することで、実際の問題がどこにあるかをデバッグするのに役立ちます。

于 2011-02-07T02:37:02.673 に答える
1

UI がブロックされるため、メイン スレッドでネットワーク処理を行わないでください。あなたの場合、MBProgressHUDアニメーション化も表示もされません。

使用しないでくださいperformSelectorOnMainThread。代わりに、メソッドconnectToServiceを直接呼び出します。を呼び出すと、MBProgressHUDはそれ自体で新しいスレッドを切り離しますshowWhileExecuting

于 2011-02-06T16:55:35.177 に答える
0

私のユーティリティクラスを変更することで、最終的にこれを理解しました。メインセレクターを2回実行していました!

于 2011-02-07T08:53:24.777 に答える