#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];