封装RAC的网络请求方式
+ (RACSignal *)rac_request:(NSString *)apiName parameters:(NSDictionary *)parameters showError:(BOOL)showError {
NSAssert(apiName != nil, @"identifier 不能为空");
Class requestClass = NSClassFromString(apiName);
NSAssert(requestClass != nil, @"未找到 %@ 类", apiName);
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
YTKRequestWithAuth *api = [[requestClass alloc] init];
NSAssert([api isKindOfClass:[YTKRequestWithAuth class]], @"class %@ must be a subclass of YTKRequestWithAuth", apiName);
[api setRequestArgumentWithAuth:parameters];
[api setSuccessCompletionBlock:^(__kindof YTKRequestWithAuth *request){
if (request.responseSerializerType == YTKResponseSerializerTypeHTTP) {
[subscriber sendNext:request.responseString];
} else {
[subscriber sendNext:request.responseJSONObject];
}
[subscriber sendCompleted];
}];
[api setFailureCompletionBlock:^(__kindof YTKRequestWithAuth *request) {
if (request.responseStatusCode == 200) {
if (request.responseSerializerType == YTKResponseSerializerTypeHTTP) {
[subscriber sendNext:request.responseString];
} else {
[subscriber sendNext:request.responseJSONObject];
}
[subscriber sendCompleted];
} else if (request.authStrategy == AuthStrategyTokenWithSign && request.responseStatusCode == 403) {
NSLog(@"==== 重新申请token ========");
// 如果请求失败是由于认证未通过则获取新的token后retry请求
[AuthTokenManager refreshAuthTokenWithCompletion:^(NSString *token, NSError *tokenError) {
if (!tokenError) {
YTKRequestWithAuth *requestTwice = [[requestClass alloc] init];
requestTwice.requestArgumentWithAuth = request.requestArgumentWithAuth;
[requestTwice startWithCompletionBlockWithSuccess:request.successCompletionBlock failure:^(__kindof YTKRequestWithAuth *request2) {
if (request.responseStatusCode == 200) {
if (request.responseSerializerType == YTKResponseSerializerTypeHTTP) {
[subscriber sendNext:request.responseString];
} else {
[subscriber sendNext:request.responseJSONObject];
}
[subscriber sendCompleted];
} else {
NSError *error = [self proccessResponseForRequest:request];
[subscriber sendError:error];
}
}];
} else {
// [subscriber sendError:tokenError];
}
}];
} else {
NSError *error = [self proccessResponseForRequest:request];
[subscriber sendError:error];
}
}];
[api startWithAgent:nil];
return [RACDisposable disposableWithBlock:^{
[api stop];
}];
}] replayLazily];
if (showError) {
[signal subscribeError:^(NSError *error) {
}];
}
return signal;
}
- (void)refreshData{
[[FYAPIClient rac_request:@"WebGetDialogDetailInfo" parameters:@{@"dialog_tid":self.model.TID} showError:YES]subscribeNext:^(id x) {
} completed:^{
[self refreshDataSource];
} ] ;
}
- (void)refreshDataSource{
NSDictionary *params;
if (pageIndex>0&&self.dataSource.count>0) {
LastTestMsgModel *model = self.dataSource.firstObject;
params = @{@"pagesize":@PAGESIZE,@"dialog_tid":self.model.TID,@"tid":model.TID};
}else{
params = @{@"pagesize":@PAGESIZE,@"dialog_tid":self.model.TID};
}
[[FYAPIClient rac_request:@"WebGetChatList" parameters:params showError:YES] subscribeNext:^(id x) {
}];
}
RAC网络封装以及多个网络请求嵌套
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 1.MVVM 代替 MVC 原因 无论MVC还是MVVM,包括其他设计模式,核心目的是为了提高代码的简洁性,降低耦...