Блоки запускаются один за другим при использовании dispatch_group_async - PullRequest
0 голосов
/ 07 января 2011

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

Ответы [ 2 ]

3 голосов
/ 29 января 2011

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 голос
/ 07 января 2011

Во-первых, нет, async () не гарантирует асинхронное выполнение блоков.Это произойдет только в том случае, если какой-либо блок заблокирован в ожидании чего-либо.Затем GCD раскручивает другой поток.

Однако, если система уже относительно загружена, GCD не собирается раскручивать новый поток для выполнения некоторой работы, если работа уже выполняется.1004 * Во-вторых, нет смысла толкать NSURLRequest s в фон через GCD.NSURLRequest уже поддерживает асинхронные загрузки.

...