0

我在让 MBProgressHUD 正常工作时遇到问题。使用下面的代码,它只是在发出服务器请求后立即显示和隐藏。我理解这是因为请求和加载指示器代码在主线程的同一循环中运行,因此加载指示器的显示直到当前主线程循环迭代之后才会执行。

这是代码。在发出服务器请求时,我该怎么做才能使 MBProgressHUD 显示?此应用程序是用 ARC 制作的。

if ([[[UIApplication sharedApplication] keyWindow] rootViewController].view) { [MBProgressHUD showHUDAddedTo:[[[UIApplication sharedApplication] keyWindow] rootViewController].view animated:YES]; }

    NSString *urlString = (get) ? [NSString stringWithFormat:@"%@?action=%@&forumId=%@&%@", kForumDirectorUrl, action, kForumIdentifier, get] :
    [NSString stringWithFormat:@"%@?action=%@&forumId=%@", kForumDirectorUrl, action, kForumIdentifier];

    NSURL *url = [NSURL URLWithString:urlString];
    NSLog(@"%@", url);
    id returnObject = (json) ? [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:url] options:0 error:nil] :
    [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];

    if ([[[UIApplication sharedApplication] keyWindow] rootViewController].view) { [MBProgressHUD hideHUDForView:[[[UIApplication sharedApplication] keyWindow] rootViewController].view animated:YES]; }

    return returnObject;
4

2 回答 2

0

以这种方式对 MBHUD 进行异步调用

 dispatch_async(dispatch_get_main_queue(),^{
                  [self showProgress:@"Login Started"];
              });
于 2013-05-20T10:26:28.950 回答
0

如果您在此处执行同步请求,则会发生以下情况:

  1. 显示 MBProgressHUD
  2. 执行请求
  3. 隐藏 MBProgressHUD

所有这些都在同一个循环中执行:当您在代码中执行一些图形操作时,它们都在循环结束时执行 - 直到您的代码结束。你可以把它想象成一个“队列”(它不是一个真正的队列,但它可以帮助你理解 iOS 核心是如何工作的)。

所以你在这个虚拟队列中推送这些图形操作,然后它们一起执行,这就是你看到 ProgressHUD 片刻的原因。

您必须将请求从同步更改为异步以避免该问题,因此您将这 3 个操作分为 2 组:

  1. 显示 MBProgressHUD
  2. 执行请求

然后当操作结束时:

  1. 隐藏 MBProgressHUD

因此,您的 MBProgressHUD 将一直显示,直到请求结束。

于 2013-05-20T10:07:30.307 回答