
Untitled
By: a guest on
May 16th, 2012 | syntax:
None | size: 1.79 KB | hits: 12 | expires: Never
void _AGGenerateAndProcessInternal(dispatch_group_t pullGroup, dispatch_group_t procGroup, id (^generateBlock)(void), void (^processBlock)(id))
{
dispatch_group_wait(procGroup, DISPATCH_TIME_FOREVER);
dispatch_group_async(pullGroup, dispatch_get_global_queue(0, 0), ^{
id result = generateBlock();
if (result) {
_AGGenerateAndProcessInternal(pullGroup, procGroup, generateBlock, processBlock);
dispatch_group_async(procGroup, dispatch_get_global_queue(0, 0), ^{
processBlock(result);
});
}
});
}
void AGGenerateAndProcess(id (^generateBlock)(void), void (^processBlock)(id))
{
dispatch_group_t pullGroup = dispatch_group_create();
dispatch_group_t procGroup = dispatch_group_create();
_AGGenerateAndProcessInternal(pullGroup, procGroup, generateBlock, processBlock);
dispatch_group_wait(pullGroup, DISPATCH_TIME_FOREVER);
dispatch_group_wait(procGroup, DISPATCH_TIME_FOREVER);
dispatch_release(pullGroup);
dispatch_release(procGroup);
}
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSUInteger numChunks = 5;
__block NSUInteger numPulled = 0;
AGGenerateAndProcess(
^{
if (numPulled == numChunks) return (id)nil;
numPulled++;
int i = 1 + rand() % 6;
NSLog(@"Pull %d (%d)", numPulled, i);
sleep(i);
return (id)[NSNumber numberWithInteger:numPulled];
},
^(id obj){
int i = 1 + rand() % 6;
NSLog(@"Process %@ (%d)", obj, i);
sleep(i);
}
);
NSLog(@"All Done!");
[pool drain];
return 0;
}