Skip to content
This repository has been archived by the owner on May 19, 2018. It is now read-only.

Commit

Permalink
Futures can serialize arbitrary blocks.
Browse files Browse the repository at this point in the history
I also added conveniences for cancelling or completing with a block.
  • Loading branch information
robrix committed Feb 11, 2012
1 parent f1b7b02 commit 605c437
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 20 deletions.
9 changes: 7 additions & 2 deletions RXFutures/RXFuture.h
Expand Up @@ -14,11 +14,16 @@
}

-(void)onComplete:(void(^)())block;
-(void)onCancel:(void(^)())block;
-(void)complete;
-(void)complete:(void(^)())block; // shorthand for -onComplete: followed by -complete

-(void)onCancel:(void(^)())block;
-(void)cancel;
-(void)complete;
-(void)cancel:(void(^)())block; // shorthand for -onCancel: followed by -cancel

-(void)performBlock:(void(^)())block;

// these properties are only meaningful and safe within blocks passed to -performBlock:
@property (nonatomic, readonly, assign, getter=isCancelled) BOOL cancelled;
@property (nonatomic, readonly, assign, getter=isCompleted) BOOL completed;

Expand Down
52 changes: 34 additions & 18 deletions RXFutures/RXFuture.m
Expand Up @@ -32,50 +32,66 @@ -(void)dealloc {
}


-(void)dispatchBlock:(void(^)())block {
-(void)dispatchCallback:(void(^)())block {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block);
}


-(void)onComplete:(void(^)())block {
dispatch_async(queue, ^{
if(completed)
[self dispatchBlock:block];
else
[completionHandlers addObject:block];
});
-(void)performBlock:(void(^)())block
{
dispatch_async(queue, block);
}


-(void)onCancel:(void(^)())block {
dispatch_async(queue, ^{
[self performBlock:^{
if(cancelled)
[self dispatchBlock:block];
[self dispatchCallback:block];
else
[cancellationHandlers addObject:block];
});
}];
}


-(void)cancel {
dispatch_async(queue, ^{
[self performBlock:^{
if(!cancelled && !completed) {
self.cancelled = YES;
for(void (^block)() in cancellationHandlers) {
[self dispatchBlock:block];
[self dispatchCallback:block];
}
}
});
}];
}

-(void)cancel:(void(^)())block {
[self onCancel:block];
[self cancel];
}


-(void)onComplete:(void(^)())block {
[self performBlock:^{
if(completed)
[self dispatchCallback:block];
else
[completionHandlers addObject:block];
}];
}

-(void)complete {
dispatch_async(queue, ^{
[self performBlock:^{
if(!cancelled && !completed) {
self.completed = YES;
for(void (^block)() in completionHandlers) {
[self dispatchBlock:block];
[self dispatchCallback:block];
}
}
});
}];
}

-(void)complete:(void(^)())block {
[self onComplete:block];
[self complete];
}

@end

0 comments on commit 605c437

Please sign in to comment.