美文网首页异步编程初见
iOS 之 google / promises 实践

iOS 之 google / promises 实践

作者: 壹点微尘 | 来源:发表于2020-02-15 21:55 被阅读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);
            });
            
        }];
    }
    
    
    

    相关文章

      网友评论

        本文标题:iOS 之 google / promises 实践

        本文链接:https://www.haomeiwen.com/subject/tloyfhtx.html