iOS 之 google / promises 实践
2020-02-15 本文已影响0人
壹点微尘
iOS 中除了PromiseKit
, 还有一个功能更为强大的promise
库, 基本上满足了大部分场景需求
google / promises
参考学习文章
安装方式
pod 'PromisesObjC'
基本使用一
- (void)normalTask {
[self work1]
.then(^id _Nullable(NSArray * _Nullable resArray) {
NSLog(@"normalTask结果:%@", resArray);
return nil;
})
.catch(^(NSError * _Nonnull error) {
NSLog(@"all error:%@", error);
});
}
打印结果:
2020-02-15 21:50:13.198783+0800 PromiseDemo[6319:365249] 111111
2020-02-15 21:50:13.199643+0800 PromiseDemo[6319:365249] normalTask结果:(
zhangsan,
liming,
wangwu
)
基本使用二
- (void)normalParamTask {
[self work1]
.then(^id _Nullable(NSArray * _Nullable resArray) {
NSLog(@"normalParamTask结果1:%@", resArray);
return [self work5:@"word"];
})
.then(^id _Nullable(NSArray * _Nullable resArray) {
NSLog(@"normalParamTask结果2:%@", resArray);
return nil;
})
.catch(^(NSError * _Nonnull error) {
NSLog(@"all error:%@", error);
});
}
打印结果:
2020-02-15 21:47:23.033994+0800 PromiseDemo[6294:363024] 111111
2020-02-15 21:47:23.034538+0800 PromiseDemo[6294:363024] normalParamTask结果1:(
zhangsan,
liming,
wangwu
)
2020-02-15 21:47:25.234197+0800 PromiseDemo[6294:363024] normalParamTask结果2:(
hello,
word
)
promises.all 之all的使用
传入一个promise数组,All会等待所有的promise 状态变为fulfilled,然后按传入promise数组的顺序返回一个value的数组。如果任何一个promise被rejected,则结果promise立刻被rejected。
- (void)allTasks {
NSArray <FBLPromise *> *tasks = @[[self work1], [self work2], [self work3], [self work4]];
[FBLPromise all:tasks]
.then(^id _Nullable(NSArray * _Nullable resArray) {
NSLog(@"allTasks结果:%@", resArray);
return nil;
})
.catch(^(NSError * _Nonnull error) {
NSLog(@"all error:%@", error);
});
}
打印结果:
2020-02-15 21:51:37.664315+0800 PromiseDemo[6350:367696] 222222
2020-02-15 21:51:37.664810+0800 PromiseDemo[6350:367696] 444444
2020-02-15 21:51:38.764402+0800 PromiseDemo[6350:367696] 111111
2020-02-15 21:51:38.764882+0800 PromiseDemo[6350:367696] 333333
2020-02-15 21:51:38.765636+0800 PromiseDemo[6350:367696] allTasks结果:(
(
zhangsan,
liming,
wangwu
),
(
1,
2,
3
),
(
2,
3,
4
),
(
3,
4,
5
)
)
promises.all 之any的使用
传入一个promise数组,Any会等待所有的promise 状态变为fulfilled或者rejected,只要有一个prmise状态完成,这结果promise状态会被决议成fulfilled,当所有的promise状态都变为rejected时,结果promise状态也变为rejected,error信息同状态最后变为rejected的promise的error相同。
- (void)anyTasks {
NSArray <FBLPromise *> *tasks = @[[self work1], [self work2], [self work3], [self work4]];
[FBLPromise any:tasks]
.then(^id _Nullable(NSArray * _Nullable resArray) {
NSLog(@"anyTasks结果:%@", resArray);
return nil;
})
.catch(^(NSError * _Nonnull error) {
NSLog(@"all error:%@", error);
});
}
打印结果:
2020-02-15 21:54:04.549104+0800 PromiseDemo[6366:369763] 222222
2020-02-15 21:54:04.549644+0800 PromiseDemo[6366:369763] 444444
2020-02-15 21:54:05.350207+0800 PromiseDemo[6366:369763] 111111
2020-02-15 21:54:05.350545+0800 PromiseDemo[6366:369763] 333333
2020-02-15 21:54:05.351177+0800 PromiseDemo[6366:369763] anyTasks结果:(
(
zhangsan,
liming,
wangwu
),
(
1,
2,
3
),
(
2,
3,
4
),
(
3,
4,
5
)
)
执行任务代码
- (FBLPromise<NSString *> *)work1 {
return [FBLPromise async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"111111");
fulfill(@[@"zhangsan", @"liming", @"wangwu"]);
// reject([NSError errorWithDomain:@"" code:-2 userInfo:@{@"error":@"失败了"}]);
});
}];
}
- (FBLPromise<NSArray *> *)work2 {
return [FBLPromise async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"222222");
fulfill(@[@1, @2, @3]);
});
}];
}
- (FBLPromise<NSArray *> *)work3 {
return [FBLPromise async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"333333");
fulfill(@[@2, @3, @4]);
});
}];
}
- (FBLPromise<NSArray *> *)work4 {
return [FBLPromise async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"444444");
fulfill(@[@3, @4, @5]);
});
}];
}
- (FBLPromise <NSArray *>*)work5:(NSString *)str
{
return [FBLPromise async:^(FBLPromiseFulfillBlock _Nonnull fulfill, FBLPromiseRejectBlock _Nonnull reject) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *resArray = @[@"hello"].mutableCopy;
[resArray addObject:str];
fulfill(resArray);
});
}];
}