networkActivityIndi​​catorVisible not working(同步请求)

时间:2012-01-04 06:21:42

标签: iphone objective-c ios uiactivityindicatorview

-(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;
}

我的代码有问题吗?或同步请求有什么不同??? 任何建议??或者我应该使用AcivityIndi​​cator视图吗?

1 个答案:

答案 0 :(得分:4)

我的猜测是网络活动指标需要一些视图的布局,也就是说,当你使它(可见)可见时,它会在某个时刻发送[self setNeedsLayout]。此方法不会立即导致布局,它只是将视图标记为需要布局,并且在运行循环结束时发生实际布局。在您的情况下,问题是您使用同步请求阻止主线程,以便在之后发生运行循环的结束,使指示器再次不可见。

有唯一的方法可以避免阻塞主线程:从主线程的角度来看它是异步的。你可以

  • 使用异步NSURLConnection API;
  • 在后台线程上使用同步NSURLConnection API;
  • 将同步NSURLConnection API与NSOperationQueue一起使用。

想法是显示网络活动指示符,启动网络请求,让主线程的运行循环旋转,并在请求完成时隐藏指示符。