Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

异步请求串行形成任务链,当其中一个任务中断则断开整条任务链

License

Notifications You must be signed in to change notification settings

dengyafeng001/taskChain

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

10 Commits

Repository files navigation

taskChain

把有依赖关系的异步请求串行形成任务链,当其中一个任务要求中断则断开整条任务链,后续任务也不会继续执行。 根据实际项目中的业务需求做的封装,可能不适用于大部分同学的项目需求,但至少比使用gcd实现串行看起来代码整洁不少。如果赞同请给颗star〜〜

背景

在我开发项目过程中有这样一个场景,应用启动时要先更新token(已登录情况),然后获取用户资料,更新服务器配置信息等,后两个请求是必须依赖token更新成功的,所以需要把它们从业务上串连起来。

实现

参考ReactiveCocoa和Masory两大第三方框架的链式编程特点,实现了"中括号"和"点block"两种调用方式。另外实现了任务间传参的需求,方便两个任务间要根据参数来做不同逻辑处理。

###原理: 通过run方法传递进来的任务会保存到array数组中,然后取第一个任务开始执行,当第一个任务执行完毕(任务需要主动回调next())继续下一个。如果其中一个任务回调了next(NO),则把array中所有任务remove掉。参数传递的原理也是通过next,前一个任务在执行完毕后回调next(YES,data)来把参数传递到下一个任务中。

//不携带传递参数,masory风格
  TaskChain *mm = [[TaskChain alloc] init];
 mm.run(^(void(^next)(BOOL go)){
 [self longTimeTask:^{
 NSLog(@"12");
 next(YES);
 }];
 }).run(^(void(^next)(BOOL go)){
 [self longTimeTask:^{
 NSLog(@"13后面不会执行");
 next(NO);
 }];
 }).run(^(void(^next)(BOOL go)){
 [self longTimeTask:^{
 NSLog(@"14");
 next(YES);
 }];
 });
  //携带传递参数,RAC风格
  PTaskChain *mgr = [[PTaskChain alloc] init];
 [[mgr run:^(id input, void (^next)(BOOL go, id output)) {
 [self longTimeTask:^{
 NSLog(@"1:传递来的参数:%@",input);
 next(YES,@"1");
 }];
 }] run:^(id input, void (^next)(BOOL go, id output)) {
 [self longTimeTask:^{
 NSLog(@"2:传递来的参数:%@",input);
 next(YES,@"2");
 }];
  }];```

About

异步请求串行形成任务链,当其中一个任务中断则断开整条任务链

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /