Как использовать NSUrlConnection для получения данных из Интернета? - PullRequest
0 голосов
/ 20 сентября 2011

В моем приложении я хочу использовать класс NSURLConnection.Поэтому, пожалуйста, скажите мне, как использовать этот?Он содержит множество методов делегатов, скажите, пожалуйста, как их использовать?

Ответы [ 2 ]

12 голосов
/ 20 сентября 2011

Инициируйте соединение, используя

self.responseData = [NSMutableData data];
NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection autorelease];

и вы можете перехватить ответ в методе делегата connectionDidFinishLoading

#pragma mark - NSURLConnection Delegate Methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.responseData setLength:0];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed: %@", [error description]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        //Getting your response string
    NSString *responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseData = nil;
    }

Для вашей проблемы утечки памяти

Объявление данных ответа в файле интерфейса

NSMutableData *_responseData;

со свойством как показано ниже

@property (nonatomic, retain) NSMutableData *responseData;

и синтезировать его

@synthesize responseData = _responseData;

Никогда не выпускайте его (мы использовали удобные конструкторы для выделения). Мы уже установили его на ноль в методе connectionDidFinishLoading.

5 голосов
/ 16 июля 2013

В iOS 5 и OS X 10.7 или более поздней версии вы можете загружать данные асинхронно, используя следующее:

NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue]
       completionHandler: ^(NSURLResponse * response, NSData * data, NSError * error) {
           NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse*)response;
           if(httpResponse.statusCode == 200) {
               //your code to handle the data
           }
       }
];

Или если вы хотите сделать это синхронно (не рекомендуется, если вы загружаете большие данные, так как приложение будет зависать) (доступно в OS X 10.2+ и iOS 2.0 +)

NSURL *url = [NSURL URLWithString:@"http://sampleurl/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSURLResponse * response;
NSError * error;
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
...