2014-12-10 3 views
1

Я хочу создать 2 очереди асинхронизации с блоками завершения и после завершения этих блоков я хочу запустить какое-то действие. Я не могу добиться этого с помощью этого кода. Где мое плохое?Создание очередей блоков с завершением

dispatch_queue_t queue = dispatch_queue_create("com.company.queue", 0); 
dispatch_group_t group = dispatch_group_create(); 

dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 

    // block 1 
    dispatch_group_async(group, queue, ^{ 

     [[WebRequests sharedInstance] request:@{@"type" : [NSNumber numberWithInt:request_uploadAdv], @"adv" : adv} withCompletion:^(id response) { 
      BOOL success = [response boolValue]; 
      NSLog(@"done1 text"); 
      // block 1 Done 
     }]; 
    }); 


    // block 2 //картинки 
    dispatch_group_async(group, queue, ^{ 

    [self getImagesForAdv:adv completion:^(NSArray *images) { 
     [[WebRequests sharedInstance] uploadPhotos:images completion:^(BOOL success) { 

      uploadImagesSuccess = YES; 
      NSLog(@"done1 2\n"); 
     // block 2 Done 
     }]; 
    }]; 

}); 

dispatch_group_notify(group, queue, ^{ 
    printf("all tasks are finished!\n"); 
}); 

ответ

1

Во-первых, вам не хватает }); где-то там. Во-вторых, в любом случае нет необходимости в внешнем вызове dispatch_group_async. Предполагая, что это так, потому что вы хотите, чтобы эти вещи выполнялись с приоритетом фона, вы можете сделать это вместо этого:

dispatch_queue_t queue = dispatch_queue_create("com.company.queue", 0); 
dispatch_set_target_queue(queue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); 
dispatch_group_t group = dispatch_group_create(); 

// block 1 
dispatch_group_async(group, queue, ^{ 

    [[WebRequests sharedInstance] request:@{@"type" : [NSNumber numberWithInt:request_uploadAdv], @"adv" : adv} withCompletion:^(id response) { 
     BOOL success = [response boolValue]; 
     NSLog(@"done1 text"); 
     // block 1 Done 
    }]; 
}); 


// block 2 //картинки 
dispatch_group_async(group, queue, ^{ 

    [self getImagesForAdv:adv completion:^(NSArray *images) { 
     [[WebRequests sharedInstance] uploadPhotos:images completion:^(BOOL success) { 

      uploadImagesSuccess = YES; 
      NSLog(@"done1 2\n"); 
      // block 2 Done 
     }]; 
    }]; 

}); 

dispatch_group_notify(group, queue, ^{ 
    printf("all tasks are finished!\n"); 
}); 
+0

Это великолепно. Любопытно: если бы мы хотели вернуться в основную очередь в 'dispatch_group_notify', мы могли бы настроить другую целевую очередь, ориентированную на основную очередь, и использовать ее во втором параметре' dispatch_group_notify' (то есть 'dispatch_group_notify (group, mainQueue)' «Я знаю, что избыточно создавать очередную очередь как« mainQueue », а затем использовать другую« dispatch_set_target_queue »с ней. Но просто хотелось знать, правильно ли было бы делать теоретически. Спасибо. – Unheilig

+1

Да, это сработает. – ipmcc

Смежные вопросы