如何使用GCD创建NSURLRequest队列?

时间:2012-08-27 14:10:28

标签: iphone objective-c cocoa-touch nsurlconnection grand-central-dispatch

我有一个NSMutableArray包含7个互联网URLs,我需要抓取HTTP标题。

我正在使用这些方法建立asynchronous连接(并且一切都很完美):

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

问题是我需要按照URL的顺序下载每个NSMutableArray,但由于asynchronous连接的性质,订单会搞砸。

我不想使用synchronous个连接,因为它们会阻止Main Thread.

如何使用GCD上的Main Thread建立队列,以确保下载将遵循包含7 {{1}的NSMutableArray的0到6之间的索引顺序}}?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

你不需要GCD。您可以从第一次下载开始,然后在connectionDidFinishLoadingdidFailWithError开始下一次下载。您只需要维护当前下载的索引,以便知道您是否已完成或下次启动下载。

以下只是这个想法的草图:

// Start the first download:
self.currentDownload = 0;
request = [NSURLRequest requestWithURL:[self.myURLArray objectAtIndex:0]];
connection = [NSURLConnection connectionWithRequest:request delegate:self];

// and in connectionDidFinishLoading/didFailWithError:
self.currentDownload++;
if (self.currentDownload < self.myURLArray.count) {
    request = [NSURLRequest requestWithURL:[self.myURLArray objectAtIndex:self.currentDownload]];
    connection = [NSURLConnection connectionWithRequest:request delegate:self];
} else {
     // All downloads finished.
}

答案 1 :(得分:1)

我认为其他解决方案相当不灵活,使用NSOperation可能会更好。可以在NSHipsterApple's documentation找到一个很好的介绍。关于此主题还有几个Stack Overflow问题和this