Sequencer是一个用于异步流程控制的iOS库。
Sequencer将复杂的嵌套块逻辑转换为干净、直接且易于阅读的代码。
让我们将一些字符串输出到日志控制台
Sequencer *sequencer = [[Sequencer alloc] init];
[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSLog(@"This is the first step");
completion(nil);
}];
[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSLog(@"This is another step");
completion(nil);
}];
[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSLog(@"This step is going to do some async work...");
int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"finished the async work.");
completion(nil);
});
}];
[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSLog(@"This is the last step");
completion(nil);
}];
[sequencer run];
上面的代码做了什么?
Sequencer
。不需要保留或持有它。请相信我。result
对象的completion()
来完成。这个结果会被发送到下一个步骤(在我们的例子中,结果是nil
)。运行
了Sequencer。注意:只需要通过移除对completion(nil)
的调用来分离步骤。所有东西都将被自动清理。
让我们做一些更有用的事情。
我们将调用app.net API获取最新动态,读取最后一个动态的URL,并读取该URL的HTML内容。
(使用AFNetworking进行所有网络操作)
Sequencer *sequencer = [[Sequencer alloc] init];
[sequencer enqueueStep:^(id result, SequencerCompletion completion) {
NSURL *url = [NSURL URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
completion(JSON);
} failure:nil];
[operation start];
}];
[sequencer enqueueStep:^(NSDictionary *feed, SequencerCompletion completion) {
NSArray *data = [feed objectForKey:@"data"];
NSDictionary *lastFeedItem = [data lastObject];
NSString *cononicalURL = [lastFeedItem objectForKey:@"canonical_url"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:cononicalURL]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
completion(responseObject);
} failure:nil];
[operation start];
}];
[sequencer enqueueStep:^(NSData *htmlData, SequencerCompletion completion) {
NSString *html = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];
NSLog(@"HTML Page: %@", html);
completion(nil);
}];
[sequencer run];
Sequencer遵循MIT许可证
版权所有(c) 2013 Tal Bereznitskey
任何获得本软件及其相关文档文件(“软件”)副本的人,在此免费许可使用该软件,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售副 本的权利,以及允许获得软件的人这样做,前提是按照以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
该软件“按原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、适用于特定目的和无侵犯性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论源于合同、侵权或其他行为,源于、涉及或与该软件或该软件的使用或其他交易相关。
在 GitHub 上找到我:Tal Bereznitskey
在 Twitter 上关注我:@ketacode