网络活动指示器不起作用(同步请求)

4
-(IBAction) webRequest;
{
    response = [[NSMutableData alloc] init];
    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc]
                                initWithURL: [NSURL URLWithString:kResourcesURL]
                                cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
                                timeoutInterval: 10];
    [theRequest setValue:@"application/json" forHTTPHeaderField:@"accept"];
    [theRequest setValue:strToken forHTTPHeaderField:@"token"];

    //show network activity indicator
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    response = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlresponse error:&nserror];
    NSString *strResponse = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    SBJsonParser *sbjasonparser = [[SBJsonParser alloc] init];
    arrResponse = [sbjasonparser objectWithString:strResponse error:nil];

    //hide network activity indicator
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

我的代码有问题吗?或者同步请求有什么区别吗? 有什么建议吗?或者我应该使用ActivityIndicator视图?

1个回答

4
我猜测,网络活动指示器需要对一些视图进行布局,也就是说,在你将其设置为可见或不可见时,它会在某个时刻发送[self setNeedsLayout]方法。该方法不会立即导致布局,而只是标记视图需要布局,实际的布局在运行循环结束时完成。在您的情况下,问题在于您使用同步请求阻塞了主线程,因此在使指示器再次不可见后,运行循环的末尾出现了。
避免阻塞主线程的唯一方法是从主线程的角度使其异步。您可以采取以下措施:
  • 使用异步的NSURLConnection API;
  • 在后台线程上使用同步的NSURLConnection API;
  • 使用带有NSOperationQueue的同步NSURLConnection API。
这个想法是显示网络活动指示器,开始一个网络请求,让主线程的运行循环旋转,并在请求完成时隐藏指示器。

非常正确。您不应在主线程上执行同步网络请求(或任何其他耗时的工作)。在该任务完成之前,您的应用程序将无响应。这不仅是糟糕的用户体验,而且当应用程序长时间无响应时,操作系统将终止您的应用程序。一旦您在真实的网络环境下尝试本问题中所示的同步方法,您的应用程序将看起来像被锁定和崩溃了。 - Jonah
@Jonah:如果下一个视图的布局完全取决于当前请求的响应,该怎么办? - viral
@codeCube:你可以使用 NSURLConnectionDelegate 方法。如果你选择了后台线程或 NSOperationQueue 路线,请使用 -performSelectorOnMainThread:withObject:waitUntilDone: 来调用你的视图配置代码。如果你能承受 iOS 5 以上版本的代码,将视图配置放入 +sendAsynchronousRequest:queue:completionHandler: 的完成块中。 - Costique
@Costique:NSOperationQueue 不适用于 iOS,我猜测。我尝试找到它,只找到了 Mac 版本。 - viral
@codeCube:根据文档和头文件,NSOperationQueue在iOS 2.0及更高版本中可用。但是,某些方法是在iOS 4.0中添加的。 - Costique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接