最近在學(xué)JS,發(fā)現(xiàn)使用JS的Promise寫(xiě)多個(gè)異步請(qǐng)求不需要嵌套,挺友好。所以就想研究下OC有沒(méi)對(duì)應(yīng)的方式。
OC的話可以通過(guò)ReactObj這個(gè)庫(kù)來(lái)實(shí)現(xiàn)。ReactObj主要是為了實(shí)現(xiàn)MVVM而生的,通過(guò)信號(hào)控制一切。
1、先定義三個(gè)異步請(qǐng)求函數(shù)
接口2依賴(lài)接口的結(jié)果,接口3依賴(lài)接口2的結(jié)果。
//接口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依賴(lài)接口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依賴(lài)接口2的結(jié)果
- (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、把三個(gè)接口轉(zhuǎn)換成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");
}];