2015-08-28 23 views
0

我有三項任務。 task1,task2和task3。 task1和task2是異步任務,他們同時做任務,返回完成結果的時間是不可預知的。原來,我希望task1和task2同時做,並在得到結果做task3之後。如何在IOS中處理這種異步任務?

dispatch_group_t dispatchGroup = dispatch_group_create();  

dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //do task1 async 
}); 
dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //do task2 async 
}); 
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){ 

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    while (true) { 
     sleep(0.2); //avoid cpu timeslice fully used 
     //after get task1 and task2 result 
     // do task3 
}}); 

我設計的結構如上,但我總是得到壞的結果,就像如果TASK2是使用afnetworking一個URL post請求,我不能涉足的成功塊。

有人幫我我會很感激。

+0

你對task1和task2使用一個或多個線程嗎? – AleyRobotics

+0

不,任務1和任務2都是使用網絡的URL發佈請求。發佈請求是異步的。 – Roby

+0

我使用dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { });它是異步的。 – Roby

回答

0

我覺得有這樣一個解決方案:

__weak CLASS * weakSelf = self; 
bool task1Done; 
bool task2Done; 

FIRST ONE TASK 
task1Done = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     do something at background.... 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      do some thing at main thread... 
     [weakSelf task1Done]; 
     }); 
    }); 

SECOND TASK 
task2Done = NO; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     do something at background.... 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      do some thing at main thread... 
     [weakSelf task2Done]; 
     }); 
    }); 


============ 
-(void) task1Done 
{ 
    task1Done = YES; 
    if (task1Done && task2Done) [self startTask3]; 
} 

-(void) task2Done 
{ 
    task2Done = YES; 
    if (task1Done && task2Done) [self startTask3]; 
} 

-(void) startTask3 
{ 
..... 
} 
0

OK,還有一個解決辦法:

  dispatch_group_t group = dispatch_group_create(); 
      dispatch_queue_t queue1 = ...; 
      dispatch_queue_t queue2 = ...; 
      //add task to queue 
      dispatch_group_async(group, queue1, ^{NSLog(@"Hello, World! TASK 1"); }); 
      dispatch_group_async(group, queue2, ^{NSLog(@"Hello, World! TASK 2"); }); 
// wait forever 
      dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
// or wait with timeout 
      dispatch_group_wait(group, DISPATCH_TIME_NOW); 

      //Add notify for end of all tasks 
      dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"Tasks 1 and 2 are done!");}); 

檢查,如果時間超出

dispatch_time_t waitTime = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC); 
long waitResult = dispatch_group_wait(group, waitTime); 

if (waitResult == 0) 
{ 
    // all done! 
} else 
{ 
    // time out 
} 

不要忘記版本

dispatch_release(group);