Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @implementation PullProcessObject
- @synthesize delegate;
- - (id)init;
- {
- if (!(self = [super init])) {
- return nil;
- }
- mPullQueue = dispatch_queue_create(NULL, 0);
- mProcQueue = dispatch_queue_create(NULL, 0);
- return self;
- }
- - (void)dealloc
- {
- dispatch_release(mPullQueue);
- dispatch_release(mProcQueue);
- [super dealloc];
- }
- - (void)doPull:(dispatch_semaphore_t)prevSem
- {
- dispatch_async(mPullQueue, ^{
- id result = [delegate pull];
- if (result) {
- dispatch_semaphore_t sem = dispatch_semaphore_create(0);
- dispatch_async(mProcQueue, ^{
- [delegate process:result];
- dispatch_semaphore_signal(sem);
- });
- dispatch_async(mPullQueue, ^{
- if (prevSem) {
- dispatch_semaphore_wait(prevSem, DISPATCH_TIME_FOREVER);
- dispatch_release(prevSem);
- }
- [self doPull:sem];
- });
- } else {
- if (prevSem) {
- dispatch_semaphore_wait(prevSem, DISPATCH_TIME_FOREVER);
- dispatch_release(prevSem);
- }
- dispatch_async(mProcQueue, ^{
- [delegate done];
- });
- }
- });
- }
- - (void)start
- {
- [self doPull:nil];
- }
- @end
Add Comment
Please, Sign In to add comment