Закрытие асинхронного подключения к потоку NSURLConnection

#ios #iphone #objective-c #nsurlconnection

#iOS #iPhone #objective-c #nsurlconnection

Вопрос:

Я использовал NSURLConnection для получения некоторых данных из Интернета в потоке, отдельном от основного потока: я поместил это в свой JSONViewController.h :

 #import <UIKit/UIKit.h>

@interface JSONViewController : UIViewController <NSURLConnectionDelegate> {
   BOOL firstTime;
   NSMutableData *_responseData;
}
@end
 

Я использую этот код для запуска соединения в JSONViewController.m:

 NSURLRequest *request;
 if (self.jsonItem == nil) {
        request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",MY_URL,@"testvalue"]]];
  }else {
        request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",MY_URL,(NSString *)self.jsonItem]]];
  }
  NSLog(@"json Item = %@",self.jsonItem);


  // Create url connection and fire request
  NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
 

Я также реализую те функции, которые также связаны с протоколом NSURLConnection:

 #pragma mark NSURLConnection Delegate Methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    _responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_responseData appendData:data];
}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    return nil;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {}
 

Все работает хорошо.
Вопрос в следующем: после того, как я получу результат и соединение должно быть завершено, почему я все еще вижу этот маленький индикатор рядом с полем несущей над панелью навигации? должен ли я остановить соединение вручную?

введите описание изображения здесь

Ответ №1:

Где-то в вашем коде вы должны найти что-то вроде этого:

 UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
 

Это устанавливает индикатор активности в строке состояния на «включено».
Когда загрузка будет завершена, вам нужно снова отключить ее. Сделайте это с помощью:

 UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = NO;
 

Если вы загружаете не более одного файла одновременно, просто добавьте две строки в свои connectionDidFinisLoading didFailWithError реализации метода and .

Комментарии:

1. я боялся, что соединение все еще работает в фоновом режиме. Спасибо 🙂

2. Это, конечно, не так, если вы получаете вызов одного из этих методов.

3. Теоретически вы могли бы запустить несколько подключений параллельно. Для каждого из них будет вызван один из этих методов.

Ответ №2:

В методе start поместите свой метод function:

 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
 

… и в завершении поместите в connectionDidFinisLoading и connectiondidFailWithError :

 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 

Надеюсь, это поможет!

Ответ №3:

Вы можете скрыть это с помощью этой простой строки

   [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];