0

我有一个通过 NSURL 访问我的网站的方法。这很好用,但我希望在处理网络呼叫时显示一个活动指示器。

我的问题是活动指示器直到 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];

}
4

3 回答 3

2

您应该将您的网络代码放在后台队列中,否则 UI 将冻结,就像您现在所经历的一样

你可以做类似的事情

NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue addOperationWithBlock:^{
    //Your network code
}];
于 2013-08-09T07:16:17.440 回答
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

于 2013-08-09T07:25:42.817 回答
1

您还可以使用Grand Central Dispatch (GCD)根据您的代码在后台调用您的 URL,如下所示:-

  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];
            });
        });
于 2013-08-09T07:21:44.980 回答