Блоки уволены один за другим при использовании dispatch_group_async

StackOverflow https://stackoverflow.com/questions/4620028

Вопрос

URL в массиве называются один за другим. Должна ли это не назвать все одновременно, как nsopurationceue? Пожалуйста, помогите мне здесь, спасибо

  - (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;
  }
Это было полезно?

Решение

Dispatch_Queue_Create создает очередь ФИФО. Он принимает блоки один за другим из очереди в той же теме по порядку. Если вы хотите выполнить блоки одновременно, вы можете создавать разные очереди для каждого блока или получать использование одной из глобальных очередей.

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

Эти очереди не ждут предыдущего завершения блока. Таким образом, ваши загрузки будут выполняться одновременно.

Другие советы

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

Однако, если система уже относительно загружается, GCD не собирается раскрутить новую тему, чтобы выполнить некоторую работу, если работа уже происходит.

Во-вторых, нет причин толкать NSURLRequestS на задний план через GCD. NSURLREQUEST поддерживает асинхронные загрузки уже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top