Как отправить асинхронный URL-запрос? - PullRequest
21 голосов
/ 15 декабря 2011

Я хотел бы знать, как получить возвращаемое значение только 1 или 0 .... обратно из запроса URL-адреса асинхронно.

В настоящее время я делаю это следующим образом:

NSString *UTCString = [NSString stringWithFormat:@"http://web.blah.net/question/CheckQuestions?utc=%0.f",[lastUTCDate timeIntervalSince1970]];
NSLog(@"UTC String %@",UTCString);
NSURL *updateDataURL = [NSURL URLWithString:UTCString];
NSString *checkValue = [NSString stringWithContentsOfURL:updateDataURL encoding:NSASCIIStringEncoding error:Nil];
NSLog(@"check Value %@",checkValue);

это работает, однако он блокирует мой основной поток до тех пор, пока я не получу ответ от URL, как мне установить его, чтобы он делал это в другом потоке вместо основного потока?

РЕДАКТИРОВАТЬ: ОТВЕТ Я заканчиваю вызывать мои функции с этим, это работает хорошо:)

[self performSelectorInBackground:@selector(shouldCheckForUpdate) withObject:nil];

Ответы [ 5 ]

28 голосов
/ 15 декабря 2011

вы можете использовать NSURLConnection класс

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: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 

Вы можете найти реализацию NSURLConnection

Редактировать: Хотя NSURLConnection предоставляется Apple, это более рекомендуемый способ размещения запроса URL. Но я обнаружил, что библиотека AFNetworking очень экономит время, проста в реализации и надежна, но при этом проста, как сторонняя реализация. Вы должны попробовать.

24 голосов
/ 15 декабря 2011

попробуйте это:

.h:

NSMutableData *responseData;

.m:

- (void)load 
{
  NSURL *myURL = [NSURL URLWithString:@"http://www.example.com"];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];

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

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{
  responseData = [[NSMutableData alloc] init];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{
  [responseData release];
  [connection release];
  [textView setString:@"Unable to fetch data"];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{
  NSLog(@"Succeeded! Received %d bytes of data",[responseData
                                                   length]);
  NSString *txt = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease];
}
5 голосов
/ 15 декабря 2011

Используйте NSURLConnection и оставьте заявку. Затем вы можете запустить синхронное или асинхронное соединение с помощью методов NSURLConnection:

Синхронная загрузка данных

+ sendSynchronousRequest:returningResponse:error:

Асинхронная загрузка данных

+ connectionWithRequest:delegate:
– initWithRequest:delegate:
– initWithRequest:delegate:startImmediately:
– start

Проверьте класс NSURLConnection в Справочнике по API разработчика Apple.

3 голосов
/ 15 сентября 2014

Бесстыдно скопировать с https://gist.github.com/knmshk/3027474. Все кредиты идут на https://gist.github.com/knmshk.

xmlData = [[NSMutableData alloc] init];
NSURL *url = [NSURL URLWithString:
@"http://forrums.bignerdranch.com/smartfeed.php?"
@"limit=NO_LIMIT&count_limit20&sort_by=standard&"
@"feed_type=RSS2.0&feed_style=COMPACT"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
                           if (error) {
                               xmlData = nil;
                               NSLog(@"error:%@", error.localizedDescription);
                           }
                           [xmlData appendData:data];
                       }];
2 голосов
/ 16 декабря 2011

В документации iOS XCode есть пример, называемый LazyTableImages.При этом выполняется асинхронный URL-адрес, а также асинхронная загрузка изображения в ячейки UITableView, отображаемые на экране после остановки прокруткиОтличный пример протоколов, асинхронной обработки данных и т. Д.

...