Как обрабатывать разные запросы, используя connectionDidFinishLoading в одном делегате? - PullRequest
3 голосов
/ 14 ноября 2011

Всякий раз, когда я делаю вызов с помощью curl, используя следующий код:

NSURL *url = [NSURL URLWithString:requestURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
timeoutInterval:30];
if (connectionInProgress) {
    [connectionInProgress cancel];
}
connectionInProgress = [[NSURLConnection alloc]initWithRequest:request delegate:self     startImmediately:YES];

connectionDidFinishLoading - мой конечный пункт назначения, где я могу манипулировать данными ответов и вызывать свои следующие методы, чтобы продолжить работу с приложением. Если я жестко закодирую некоторые конкретные задачи, такие как

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
[parser setDelegate:self];
[parser parse];
[someLabel setText:parsedTextFromXMLData];
}

Если мне нужно сделать еще один вызов curl для другого адреса, не будет ли someLabel setText всегда переустанавливаться снова? Есть ли способ заставить эту функцию делегата вести себя по-разному при каждом вызове curl? (Кстати, является ли connectionDidFinishLoading обычно правильным местом для размещения следующего шага кодов?) Если так, то не будет ли он вызываться снова при следующем вызове curl?

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Посмотрите на это S.O. сообщение для рецепта, касающегося NSURLConnection и нескольких запросов. Предложение делает что-то вроде этого:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  if (connection == firstConnection) {
    // do something
   }
   else if (connection == secondConnection) {
    // do something else
   }
 } 

РЕДАКТИРОВАТЬ: идея в том, что connectionDidFinishLoading - это метод вашего собственного делегата (так что вы пишете его). В делегате вы сохраняете адрес каждого создаваемого вами соединения; затем, когда соединение возвращается с данными, вы сообщаете, какое это соединение, сравнивая его адрес с тем, который вы сохранили в делегате. -END РЕДАКТИРОВАТЬ

Другой вариант - использование ASIHTTPRequest framework , который предлагает механизм делегирования на основе запроса (в отличие от соединения), поэтому каждый запрос имеет объект делегата для обработки результата. ; или, другими словами, делегат получает ссылку на запрос, чтобы вы могли легко определить, какой результат запроса вы обрабатываете.

ASIHTTPRequest предлагает множество преимуществ по сравнению с NSURLConnection. Вы можете прочитать о них в этом С.О. почта .

1 голос
/ 14 ноября 2011

Для этого есть 2 варианта:

  1. вы можете реализовать отдельный класс, который будет отвечать за обработку материала делегата NSURLConnection и создавать отдельный экземпляр для каждого запроса
  2. вы можете использовать методы значения ключа NSObject в экземпляре NSURLConnection для установки некоторого тега, который будет проверен в connectionDidFinishLoading: метод

Для меня вариант 1 будет лучшим подходом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...