Skip to content

Instantly share code, notes, and snippets.

@nikolaykasyanov
Last active August 29, 2015 13:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikolaykasyanov/9739103 to your computer and use it in GitHub Desktop.
Save nikolaykasyanov/9739103 to your computer and use it in GitHub Desktop.
Poor man's generator using ReactiveCocoa 3.0
static RACSignal *BodyImageURLs(NSString *postBody)
{
NSRange (^lastRangeFromMatch)(NSTextCheckingResult *) = ^(NSTextCheckingResult *match) {
if (match == nil) {
return NSMakeRange(NSNotFound, 0);
}
else {
return [match rangeAtIndex:match.numberOfRanges - 1];
}
};
return [RACSignal create:^(id <RACSubscriber> subscriber) {
[ImageTagRegularExpression() enumerateMatchesInString:postBody
options:0
range:NSMakeRange(0, postBody.length)
usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {
if (subscriber.disposable.disposed) {
*stop = YES;
return;
}
NSRange imageURLRange = lastRangeFromMatch(match);
if (imageURLRange.location != NSNotFound) {
NSString *urlString = [postBody substringWithRange:imageURLRange];
NSURL *url = [NSURL URLWithString:urlString];
[subscriber sendNext:url];
}
}];
[subscriber sendCompleted];
}];
}
RACSignal *generator = BodyImageURLs(whateverStringWithHTML);
// Usage:
NSURL *firstURL = [generator first];
// only first regexp match will be processed
NSArray *firstThreeItems = [[generator take:3] array];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment