数组中的URL一个接一个地调用。是不应该一次性调用,如nsoperationqueue?请帮帮我,谢谢
- (void) allTasksDone {
NSLog(@"DONE");
}
- (void) callMultiple {
dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_group_t group = dispatch_group_create();
NSArray *urls = [NSArray arrayWithObjects:
@"http://www.a.com",
@"http://www.b.com",
@"http://www.c.com",
nil];
for (NSString *url in urls) {
dispatch_group_async(group, myQueue, ^{
NSLog(url);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = NULL;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSLog(@"COMPLETE");
});
}
dispatch_group_notify(group, myQueue, ^{
[self allTasksDone];
});
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self callMultiple];
[self.window makeKeyAndVisible];
return YES;
}
答案 0 :(得分:3)
dispatch_queue_create创建FIFO队列。它在相同顺序主题中添加了从队列逐个获取的块。如果要同时执行块,可以为每个块创建不同的队列,或者使用其中一个全局队列。
dispatch_queue_t dispatch_get_global_queue(
long priority,
unsigned long flags);
有3个全局队列,按优先级区分。
enum {
DISPATCH_QUEUE_PRIORITY_HIGH = 2,
DISPATCH_QUEUE_PRIORITY_DEFAULT = 0,
DISPATCH_QUEUE_PRIORITY_LOW = -2,
};
这些队列不等待先前的块完成。因此,您的下载将同时执行。
答案 1 :(得分:1)
首先,不,async()不保证块的异步执行。只有当任何给定的块被阻塞等待某事发生时才会发生这种情况。然后GCD将启动另一个线程。
但是,如果系统已经相对加载,如果工作已经开始,GCD不会启动新线程来完成某些工作。
其次,没有理由通过GCD将NSURLRequest
推入后台。 NSURLRequest已经支持异步下载。