我的工作中出现了一个小问题:我的应用程序包含一些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
答案 0 :(得分:0)
您应该异步加载数据。
如果某些事情花费的时间比预期的要长,而且您正在阻止主线程准备让整个应用程序自动终止 - 您肯定不希望这种情况发生!
至于屏幕上的更新。更新仅在当前运行循环迭代结束时发生,因此这是完全预期的行为。 (说实话,我有点惊讶,测试一目了然。)
答案 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
附近找到它。)