Есть несколько способов решить эту проблему, и каждый зависит от ваших обстоятельств. Первый - использовать несколько копий + (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];
}