Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 16th, 2012  |  syntax: None  |  size: 1.79 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. void _AGGenerateAndProcessInternal(dispatch_group_t pullGroup, dispatch_group_t procGroup, id (^generateBlock)(void), void (^processBlock)(id))
  2. {
  3.     dispatch_group_wait(procGroup, DISPATCH_TIME_FOREVER);
  4.     dispatch_group_async(pullGroup, dispatch_get_global_queue(0, 0), ^{
  5.         id result = generateBlock();
  6.         if (result) {
  7.             _AGGenerateAndProcessInternal(pullGroup, procGroup, generateBlock, processBlock);
  8.            
  9.             dispatch_group_async(procGroup, dispatch_get_global_queue(0, 0), ^{
  10.                 processBlock(result);
  11.             });
  12.         }
  13.     });
  14. }
  15.  
  16.  
  17.  
  18. void AGGenerateAndProcess(id (^generateBlock)(void), void (^processBlock)(id))
  19. {
  20.     dispatch_group_t pullGroup = dispatch_group_create();
  21.     dispatch_group_t procGroup = dispatch_group_create();
  22.    
  23.     _AGGenerateAndProcessInternal(pullGroup, procGroup, generateBlock, processBlock);
  24.    
  25.     dispatch_group_wait(pullGroup, DISPATCH_TIME_FOREVER);
  26.     dispatch_group_wait(procGroup, DISPATCH_TIME_FOREVER);
  27.    
  28.     dispatch_release(pullGroup);
  29.     dispatch_release(procGroup);
  30. }
  31.  
  32.  
  33.  
  34.  
  35. int main (int argc, const char * argv[])
  36. {
  37.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  38.     NSUInteger numChunks = 5;
  39.     __block NSUInteger numPulled = 0;
  40.    
  41.    
  42.     AGGenerateAndProcess(
  43.         ^{
  44.             if (numPulled == numChunks) return (id)nil;
  45.             numPulled++;
  46.            
  47.             int i = 1 + rand() % 6;
  48.             NSLog(@"Pull %d (%d)", numPulled, i);
  49.             sleep(i);
  50.            
  51.             return (id)[NSNumber numberWithInteger:numPulled];
  52.         },
  53.        
  54.         ^(id obj){
  55.             int i = 1 + rand() % 6;
  56.             NSLog(@"Process %@ (%d)", obj, i);
  57.             sleep(i);
  58.         }
  59.     );
  60.    
  61.    
  62.     NSLog(@"All Done!");
  63.    
  64.    
  65.     [pool drain];
  66.     return 0;
  67. }