活动指示器在NSURL呼叫之前启动动画

时间:2013-08-09 07:13:05

标签: iphone ios objective-c

我有一种方法可以通过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];

}

3 个答案:

答案 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];
            });
        });