Objective-C - Фоновая многопоточность с GCD и NSURLConnection - PullRequest
2 голосов
/ 11 ноября 2011

Как я понимаю, методы с именем *WithContentsOfURL:, такие как [NSData dataWithContentsOfURL:], являются синхронными.

Так что, если я хочу загружать с 3 URL-адресов асинхронно, используя *WithContentsOfURL: методы, я должен поместить их в GCD-рассылку, например:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSData *dataOne = [NSData dataWithContentsOfURL:dataOne];
    NSData *dataTwo = [NSData dataWithContentsOfURL:dataTwo];
    NSData *dataThree = [NSData dataWithContentsOfURL:dataThree];

});

Использует ли NSURLConnection GCD "за кадром"? Будет ли это (в некоторой степени) эквивалентно приведенным ниже методам с точки зрения асинхронной загрузки:

NSURLRequest *myRequestOne = [NSURLRequest requestWithURL:[NSURL URLWithString:URLOne] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnectionOne = [[NSURLConnection alloc] initWithRequest:myRequestOne delegate:self];

NSURLRequest *myRequestTwo = [NSURLRequest requestWithURL:[NSURL URLWithString:URLTwo] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnectionThree = [[NSURLConnection alloc] initWithRequest:myRequestTwo delegate:self];

NSURLRequest *myRequestThree = [NSURLRequest requestWithURL:[NSURL URLWithString:URLThree] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnectionThree = [[NSURLConnection alloc] initWithRequest:myRequestThree delegate:self];

Также, что случилось бы, если бы я поместил NSURLConnection внутрь dispatch_async?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Они на самом деле не эквивалентны, поскольку использование NSURLConnectionDelegate позволяет вам реагировать на такие вещи, как сбой запроса, проверка подлинности и т. Д.

Первый пример, который вы дадите, используя GCD, будет работать для действительных URL, но для всего остального не приведет к возвращению данных. Поступайте так, как предлагает Евгений, и используйте ASIHTTPRequest - это намного проще.

0 голосов
/ 11 ноября 2011

Просто используйте ASIHTTPRequest, там реализованы асинхронные запросы, вам просто нужно сделать что-то вроде этого:

ASIHTTPRequest *myRequestOne = [ASIHTTPRequest requestWithURL:URLOne];

[myRequestOne setCompletionBlock:^ {
  // do something with [request responseData];
}];

[myRequestOne startAsynchronous];
...