我有一种方法可以通过NSURL访问我的网站。这非常有效,但我希望在处理Web调用时显示一个活动指示器。
我的问题是,在NSURL通话结束后才会显示活动指示。我尝试包含两位代码,使我的活动指示符出现在方法的最顶层(请参见下文)。我确定有什么东西与UI更新时有关,但我不知道如何处理这个问题。我想要的只是让活动指示器开始动画并立即显示loadingImageView。任何帮助都会很棒。谢谢!
- (IBAction)buttonPress:(id)sender {
//ACTIVITY INDICATOR STARTS WITH THESE TWO LINES
loadingImageView.hidden = false;
[activityIndicator startAnimating];
NSString *c = [view.text stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSString *b = [[NSUserDefaults standardUserDefaults] stringForKey:@"b"];
NSString *a = [[NSUserDefaults standardUserDefaults] stringForKey:@"a"];
NSString *strURL = [NSString stringWithFormat:@"http://www.website.com/page.php?
a=%@&b=%@&c=%@",a, b, c];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL
encoding:NSUTF8StringEncoding];
NSLog (@"%@", strResult);
[[NSUserDefaults standardUserDefaults] setObject:@"true" forKey:@"newKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
[self dismissViewControllerAnimated:YES completion:nil];
}
答案 0 :(得分:2)
您应该将网络代码放在后台队列中,否则UI会冻结,就像您现在遇到的那样
您可以执行类似
的操作NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue addOperationWithBlock:^{
//Your network code
}];
答案 1 :(得分:2)
+[NSData dataWithContentsOfURL:]
方法是同步的:这意味着它会阻塞,直到数据传输完成。您从不想要在主线程上执行此操作,因为UI在数据传输期间会阻塞。
因此,您应该将数据传输移动到另一个线程,例如使用将其包装在方法中并使用[self performSelectorInBackground:@selector(foo) withObject:nil]
或使用GCD调用它:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Insert netword code here.
// Once done, resume on the main thread:
dispatch_async(dispatch_get_main_queue(), ^{
// Code to update the UI or something.
});
});
解决此问题的另一种方法是使用异步数据传输,例如使用NSURLConnection。
答案 2 :(得分:1)
您还可以使用Grand Central Dispatch (GCD)根据您的代码在后台调用您的网址: -
loadingImageView.hidden = false;
[activityIndicator startAnimating];
__Block NSString *c = [view.text stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
__Block NSString *b = [[NSUserDefaults standardUserDefaults] stringForKey:@"b"];
__Block NSString *a = [[NSUserDefaults standardUserDefaults] stringForKey:@"a"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *strURL = [NSString stringWithFormat:@"http://www.website.com/page.php?a=%@&b=%@&c=%@",a, b, c];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog (@"%@", strResult);
[[NSUserDefaults standardUserDefaults] setObject:@"true" forKey:@"newKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:nil];
});
});