networkActivityIndicatorVisible not Working (Синхронизированный запрос) - PullRequest
4 голосов
/ 04 января 2012
-(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;
}

Что-то не так с моим кодом? или синхронизированный запрос имеет какое-либо значение ??? Любое предложение ?? Или я должен использовать представление AcctivityIndicator?

1 Ответ

4 голосов
/ 04 января 2012

Я предполагаю, что для индикатора сетевой активности требуется компоновка некоторых представлений, то есть, когда вы делаете (не) видимым, он отправляет [self setNeedsLayout] в некоторый момент.Этот метод не вызывает компоновку немедленно, он просто помечает представление как нужное с фактическим макетом, происходящим в конце цикла выполнения .Проблема в вашем случае заключается в том, что вы блокируете основной поток синхронным запросом, так что конец цикла выполнения наступает через после , и вы снова делаете индикатор невидимым.

Единственный способчтобы не блокировать основной поток: сделайте его асинхронным с точки зрения основного потока.Вы можете

  • использовать асинхронный API NSURLConnection;
  • использовать синхронный API NSURLConnection в фоновом потоке;
  • использовать синхронный API NSURLConnection с NSOperationQueue.

Идея состоит в том, чтобы показать индикатор сетевой активности, запустить сетевой запрос, разрешить вращение цикла выполнения основного потока и скрыть индикатор, когда запрос завершен.

...