Web查询正在进行时发出警报?

时间:2010-08-21 11:37:02

标签: iphone

我的工作中出现了一个小问题:我的应用程序包含一些Web查询,如果使用wifi连接,几乎会立即执行,但是在3G甚至EDGE连接的情况下,它们需要几秒钟才能完成。在此期间,我想向用户表明查询正在进行中,例如通过在标签上显示消息。

代码看起来像这样:

-(void)query{
    alertLabel.text = @"in progress…";

    // the query follows...
    NSString *queryURLstring = [NSString stringWithFormat:@"http://xyz.xyz"];
    NSURL *queryURL = [[NSURL alloc] initWithString:queryURLstring];
    NSString *receivedData = [[NSString alloc] initWithContentsOfURL:queryURL];
    //query done

    alertLabel.text = @"";
}

在实践中发生的事情是,当执行查询时,用户实际上无法做任何事情。收到请求的数据后,“进行中...”文本会暂时显示,并立即消失。 我无法理解,因为这不应该如何运作。在执行查询之前,文本应显示在标签上,并且只有在完成时才应清除。 有人遇到过这样的问题吗?你能推荐一个解决方案吗? 感谢各种建议! MIV

2 个答案:

答案 0 :(得分:0)

您应该异步加载数据。

  1. 显示提醒标签
  2. 开始 异步下载
  3. 后 完成(成功或错误) 删除标签。
  4. 如果某些事情花费的时间比预期的要长,而且您正在阻止主线程准备让整个应用程序自动终止 - 您肯定不希望这种情况发生!

    至于屏幕上的更新。更新仅在当前运行循环迭代结束时发生,因此这是完全预期的行为。 (说实话,我有点惊讶,测试一目了然。)

答案 1 :(得分:0)

您的问题解决方案很少 @Eiko很好地解释了问题和原因。

接下来是一种可能的解决方案(对代码进行少量更改):

只需在后台线程中执行query方法,如下所示:

[self performSelectorInBackground:@selector(query) withObject:nil];

并将alertLabel.text = @"in progress…";替换为:

[alertLabel performSelectorOnMainThread:@selector(setText:) withObject:@"in progress…" waitUntilDone:NO];

[同样关于alertLabel.text = @"";]


如果你愿意的话会更好:

  • 添加两种方法:- (void)showLoadingWithText:(id)loadingText;- (void)hideLoading;
  • 在主线程中调用这些方法(而不是直接在标签上执行选择器)。
  • 添加一些其他活动指标,例如[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;(将在标题中显示加载指示符)或您的自定义UIActivityIndicatorView(您应该在alertLabel附近找到它。)