Несколько вызовов веб-сервисов на одном и том же viewController iphone - PullRequest
5 голосов
/ 22 июня 2011

Мне нужна помощь для выполнения нескольких вызовов веб-служб на одном контроллере представления.Есть ли способ, которым я могу это сделать.

Спасибо

1 Ответ

18 голосов
/ 22 июня 2011

Есть несколько способов решить эту проблему, и каждый зависит от ваших обстоятельств. Первый - использовать несколько копий + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error метода NSString. Поэтому, если вы хотите получить содержимое какого-либо URL, вы можете использовать следующий код

NSURL* url = [NSURL urlWithString:@"http://www.someUrl.com/some/path"];
NSString* urlContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8Encoding error:nil];
NSURL* anotherUrl = [NSURL urlWithString:@"http://www.anotherUrl.com/some/path"];
NSString* anotherUrlContents = [NSString stringWithContentsOfURL:anotherUrl encoding:NSUTF8Encoding error:nil];

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

Второй подход заключается в использовании NSURLConnection. При этом используются делегаты для управления процессом в зависимости от события. Вот хорошее резюме этого подхода здесь . Но вам также нужно будет различать запросы в методах делегатов. Например

-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response
{
    if(connection == connection1)
    {
        //Do something with connection 1
    }
    else if(connection == connection2)
    {
        //Do something with connection 2    
    }
}

Третий подход заключается в использовании некоторого класса-оболочки, который обрабатывает запросы http на более высоком уровне. Лично мне нравится ASIHTTPRequest . Он может обрабатывать запросы синхронно, асинхронно с использованием делегатов и асинхронно с использованием блоков.

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url1 = [NSURL URLWithString:@"http://example.com/path/1"];
   ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
   request1.delegate = self;
   request1.didFinishSelector = @selector(request1DidFinish);
   [request1 startAsynchronous];

   NSURL *url2 = [NSURL URLWithString:@"http://example.com/path/2"];
   ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
   request2.delegate = self;
   request2.didFinishSelector = @selector(request2DidFinish);
   [reques2 startAsynchronous];
}

- (void)request1DidFinish:(ASIHTTPRequest *)request
{
   NSString *responseString = [request responseString];
}

- (void)request2DidFinish:(ASIHTTPRequest *)request
{
   NSString *responseString = [request responseString];
}

В этом примере показано, как выполнить асинхронный запрос с использованием блоков в качестве обратных вызовов внутри методов делегатов. Обратите внимание, что это можно использовать только в iOS 4.0 и выше, так как она использует блоки. Но ASIHTTPRequest в целом можно использовать на iOS 3.0 и выше без блоков.

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://example.com/path/1"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      NSString *responseString = [request responseString];
   }];
   [request startAsynchronous];

   NSURL *url2 = [NSURL URLWithString:@"http://example.com/path/2"];
   __block ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url];
   [request2 setCompletionBlock:^{
      NSString *responseString = [request2 responseString];
   }];
   [request2 startAsynchronous];

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