第一次使用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没有显示。我认为原因如下。 xmpp connect
方法会触发对xmpp服务器的连接请求,然后就完成了。所以没有活动可以等待。
但是,在服务器响应并触发以下委托方法之前,不会建立连接:
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
我想等待这一点,然后才解雇HUD,但我不知道如何做到这一点。我错过了很简单的事情。
答案 0 :(得分:0)
您需要移动此代码
dispatch_async(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
});
在长时间运行的方法完成之后......也就是说,如果此代码确实立即返回
[[WSXmppUserManager shared] xmppStreamManager] connect];
hud可能永远不会显示......因为它被告知要显示然后被告知隐藏在同一个运行循环或者之后可能是一个运行循环......
如果这表明已收到响应并且操作已完成,为什么不将它放在此方法的末尾?
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
答案 1 :(得分: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
}