Несколько запросов на ASIHTTPRequest - PullRequest
6 голосов
/ 04 июля 2011

Мне нужно загрузить три разных набора данных с трех разных URL. Я решил использовать ASIHTTPRequest. Два URL-адреса являются фидами JSON, которые мне нужно проанализировать, и один из них - это файл .txt в Интернете, который мне нужно хранить локально.

Теперь пример, который находится на веб-сайте ASIHTTPRequest для асинхронного запроса, показывает следующее:

- (IBAction)grabURLInBackground:(id)sender {
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

Чтобы передать несколько URL-адресов, я могу вызвать «запрос» на три разных URL-адреса. Но я не уверен, как бы я справился с ними в методе requestFinished. Документация показывает это как:

- (void)requestFinished:(ASIHTTPRequest *)request {
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

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

Спасибо,

Ответы [ 4 ]

12 голосов
/ 04 июля 2011

Вы можете различать разные запросы с помощью

  • , задавая словарь userInfo запроса
  • , устанавливая didFinishSelector (и didFailSelector и т. Д.) Для различных методов
  • использование различных классов в качестве делегата
  • с использованием блоков
  • с использованием свойства тега запроса
  • подкласс ASIHTTPRequest и переопределение переопределения requestFinished: и failWithError: (рекомендуется только для сложных ситуаций)
3 голосов
/ 03 августа 2011

Вам просто нужно два фрагмента кода. Один, чтобы пометить ваш URL:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"identifierX", @"typeOfRequest",nil]];

и еще один для его идентификации:

if ([[[request userInfo] valueForKey:@"typeOfRequest"] isEqualToString:@"identifierX"]){
        // Do here whatever you need to do for the url associated with identifierX
    }

и так и должно быть!

1 голос
/ 04 июля 2011

Вы можете проверить свойство originalURL в ASIHTTPRequest, если у вас разные URL-адреса.

Или вы можете использовать [запросить хэш], чтобы получить хэш NSObject для каждого объекта и проверить это позже.

1 голос
/ 04 июля 2011

Вы можете установить имя пользователя и тег req.

это пример просмотра изображений. REQ.

UIImageView *imgV=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 416)];

    ASIHTTPRequest *req=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:[self.arr objectAtIndex:i]]];
    [req setUsername:[NSString stringWithFormat:@"%i",i]];
    [req setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:imgV,@"imgV",nil]];
    [req setDelegate:self];
    [req startAsynchronous];
    [imgV setContentMode:UIViewContentModeScaleToFill];
    [imgV setClipsToBounds:YES];
    [imgV setTag:kTagImageViewInScrollView];
    [scr2 addSubview:imgV];
    [scr2 setDelegate:self];
    [imgV release]; imgV=nil;

и в запросе Закончено

- (void)requestFinished:(ASIHTTPRequest *)request {
    [(UIImageView*)[[request userInfo] valueForKey:@"imgV"] setImage:[UIImage imageWithData:[request responseData]]];   

}
...