0

数组中的 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;
  }
4

2 回答 2

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,
};

这些队列不等待前一个块完成。因此,您的下载将同时执行。

于 2011-01-29T14:28:00.237 回答
1

首先,不,async() 不保证块的异步执行。只有当任何给定的块被阻塞等待某事发生时,才会发生这种情况。然后 GCD 将启动另一个线程。

但是,如果系统已经相对负载,如果工作已经开始,GCD 不会启动新线程来完成某些工作。

其次,没有理由NSURLRequest通过 GCD 将 s 推到后台。NSURLRequest 已经支持异步下载。

于 2011-01-06T21:36:36.223 回答