OC異步請求不嵌套

最近在學JS,發現使用JS的Promise寫多個異步請求不需要嵌套,挺友好。所以就想研究下OC有沒對應的方式。

OC的話可以通過ReactObj這個庫來實現。ReactObj主要是為了實現MVVM而生的,通過信號控制一切。

1、先定義三個異步請求函數
接口2依賴接口的結果,接口3依賴接口2的結果。

//接口1
- (void)fetchData1:(void(^)(BOOL ret, NSString *userid))callBack{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        dispatch_async(dispatch_get_main_queue(), ^{
            if(callBack) callBack(YES,@"65432");
        });
    });
}
//接口2依賴接口1返回的userid
- (void)fetchData2:(NSString *)userid callBack:(void(^)(BOOL ret,NSString *userid))callBack{
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:1];
        dispatch_async(dispatch_get_main_queue(), ^{
            if(callBack) callBack(YES,@"00000");
        });
    });
}

//接口3依賴接口2的結果
- (void)fetchData3:(NSString *)userid callBack:(void(^)(BOOL ret))callBack{
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:2];
        dispatch_async(dispatch_get_main_queue(), ^{
            if(callBack) callBack(NO);
        });
    });
}

2、把三個接口轉換成signal

- (RACSignal *)creatFetchData1Signal{
    NSLog(@"start fetchData1");
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [self fetchData1:^(BOOL ret, NSString *userid) {
            if(ret){
                [subscriber sendNext:userid];
            }else{
                [subscriber sendError:nil];
            }
            [subscriber sendCompleted];
        }];
        return nil;
    }];
}

- (RACSignal *)creatFetchData2Signal:(NSString *)userid{
    NSLog(@"start fetchData2 param>>>>%@",userid);
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [self fetchData2:userid callBack:^(BOOL ret, NSString *userid) {
            if(ret){
                [subscriber sendNext:userid];
            }else{
                [subscriber sendError:nil];
            }
            [subscriber sendCompleted];
        }];
        return nil;
    }];
}

- (RACSignal *)creatFetchData3Signal:(NSString *)userid{
    NSLog(@"start fetchData3 param>>>>%@",userid);
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [self fetchData3:userid callBack:^(BOOL ret) {
            if(ret){
                [subscriber sendNext:@(ret)];
            }else{
                [subscriber sendError:nil];
            }
            [subscriber sendCompleted];
        }];
        return nil;
    }];
}

3、使用signal

    [[[[self creatFetchData1Signal] flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        return [self creatFetchData2Signal:value];
    }]flattenMap:^__kindof RACSignal * _Nullable(id  _Nullable value) {
        return [self creatFetchData3Signal:value];
    }]subscribeNext:^(id  _Nullable x) {
        NSLog(@"ret==%@",x);
    } error:^(NSError * _Nullable error) {
        NSLog(@"error");
    } completed:^{
        NSLog(@"completed");
    }];
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容