0

初めてHUDを使って作業しましたが、混乱しています。

viewDidLoad で次のように HUD をセットアップします。

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    [[[WSXmppUserManager shared] xmppStreamManager] connect];

    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
});

HUDが表示されません。その理由は次のとおりだと思います。xmppconnectメソッドは、xmpp サーバーへの接続要求を開始し、完了します。したがって、そのまま待機するアクティビティはありません。

ただし、サーバーが応答し、次のデリゲート メソッドが起動されるまで、接続は確立されません。

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

これを待ってから HUD を閉じたいのですが、その方法がわかりません。非常に単純なものが欠けています。

4

2 に答える 2

0

このコードを移動する必要があります

dispatch_async(dispatch_get_main_queue(), ^{
    [MBProgressHUD hideHUDForView:self.view animated:YES];
});

長時間実行されるメソッドが終了した後...つまり、このコードが実際にすぐに返される場合

[[WSXmppUserManager shared] xmppStreamManager] connect];

hud は表示されない可能性が高いです...表示するように指示されてから、同じ実行ループまたはその後すぐに 1 つの実行ループで非表示にするように指示されるためです...

これが応答を受信して​​操作が完了したことを示す場合、このメソッドの最後に配置しないのはなぜですか?

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
于 2013-05-04T06:36:14.620 に答える
0
HUD =[[MBProgressHUD alloc] initWithWindow:self.view];
[HUD setDelegate:self];
[self.view addSubview:HUD];

[HUD showWhileExecuting:@selector(connectToServer)
               onTarget:self
             withObject:nil
               animated:YES];

connectToServer で

-(void)connectToServer
{
    [[[WSXmppUserManager shared] xmppStreamManager] connect];
}

connectToServer メソッドがバックグラウンドでタスクを完了するとすぐに、hudWasHidden: と呼ばれる MBProgressHUD のデリゲートが自動的に呼び出されます。

-(void)hudWasHidden:(MBProgressHUD *)hud
{
     //Further work after the background task completed
}
于 2013-05-04T07:55:02.730 に答える