异步编程初见

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);
        });
        
    }];
}


上一篇 下一篇

猜你喜欢

热点阅读