Асинхронное получение данных вместо использования initWithContentsOfURL - PullRequest
3 голосов
/ 24 марта 2012

В настоящее время я использую этот код для получения данных с URL: NSURL *url = [[NSURL alloc] initWithString:urlstring]; NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url];

Мне было интересно, как я могу собрать эти данные асинхронно, чтобы мое приложение не зависало каждый раз, когда мне нужно выполнить это. Спасибо!

Ответы [ 5 ]

8 голосов
/ 24 марта 2012

Самый простой способ доступен в OS5, например:

NSString *stringfromFB;
NSURL *url = [[NSURL alloc] initWithString:urlstring];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (data) {
        stringfromFB = [[NSString alloc] initWithData:data
                                             encoding:NSUTF8StringEncoding];  // note the retain count here.
    } else {
        // handle error
    }
}];

Если по какой-то причине вы застряли в os <5, вам нужно будет установить соединение с делегатом и реализовать протокол делегирования <a href="/1626950/est-li-polnye-primery-kotorye-ispolzuyt-vse-metody-delegata-nsurlconnection">, как показано здесь (и во многих других местах).

4 голосов
/ 24 марта 2012

Вы можете сделать это с помощью GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    NSURL *url = [[NSURL alloc] initWithString:urlstring]; 
    NSString *stringfromFB = [[NSString alloc] initWithContentsOfURL:url]
});
0 голосов
/ 27 ноября 2017

Теперь, когда NSURLConnection устарела, вам нужно использовать NSURLSession.

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *task = [session dataTaskWithRequest: request
                                        completionHandler: ^(NSData *data, NSURLResponse *response, NSError *networkError) {

            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

            if ([httpResponse statusCode] == STATUS_OK) {
                // use data                     
            }
            else {
                NSLog(@"Network Session Error: %@", [networkError localizedFailureReason]);
            }
}];

[task resume];
0 голосов
/ 24 марта 2012
// Do not alloc init URL obj. for local use.
NSString *urlString = @"put your url string here";

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Вышеуказанные методы делегата относятся к NSURLConnectionDelegate, где вам нужно обрабатывать все, например, ошибку ответа и т. Д. Он предусмотрен по умолчанию, поэтому мы можем напрямую переопределить его без

Я использовал один раз в своем проекте. Это будет работать для асинхронного запроса, но если вы также получили количество изображений, тогда также используйте IconDownloader или EGOImageView , который реализует отложенную загрузку изображения и очень низкие шансы на зависание приложения.

0 голосов
/ 24 марта 2012

Если вы не хотите ждать, пока соединение завершит загрузку URL-адреса, вы можете загрузить его асинхронно, используя NSURLConnection.

[NSURLConnection connectionWithRequest:
  [NSURLRequest requestWithURL:
  [NSURL URLWithString:yourUrlString]]
   delegate:self];
...