2014-12-10 1 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