通过AFHTTPSessionManager+RACSupport 或 AFHTTPRequestOperationManager+RACSupport 解决同一信号源(RAC网络请求两次的问题
2016-02-25 13:22
1151 查看
在RAC实际使用时发现RAC有一个在网络请求上很严重的问题,就是同一个网络url刷新时所创建的信号源
内部请求会被执行两次或多次的现象,通过代理Charles很容易看到,查了相关资料有说过该问题但大多数并没有直接指出应怎么处理,
现将
AFHTTPRequestOperationManager和 AFHTTPSessionManager相关代码如下(得修改原码)
- (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
NSURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:nil failure:nil];
RACSignal *signal = [operation rac_overrideHTTPCompletionBlock];
[self.operationQueue addOperation:operation];
[signal subscribe:subscriber];
return [RACDisposable disposableWithBlock:^{
[operation cancel];
}];
}];
}
将后面加上 replay 修改为即可解决:
- (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
NSURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:nil failure:nil];
RACSignal *signal = [operation rac_overrideHTTPCompletionBlock];
[self.operationQueue addOperation:operation];
[signal subscribe:subscriber];
return [RACDisposable disposableWithBlock:^{
[operation cancel];
}];
}] replay];
}
内部请求会被执行两次或多次的现象,通过代理Charles很容易看到,查了相关资料有说过该问题但大多数并没有直接指出应怎么处理,
现将
AFHTTPRequestOperationManager和 AFHTTPSessionManager相关代码如下(得修改原码)
- (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
return [RACSignal createSignal:^(id<RACSubscriber> subscriber) {
NSURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:nil failure:nil];
RACSignal *signal = [operation rac_overrideHTTPCompletionBlock];
[self.operationQueue addOperation:operation];
[signal subscribe:subscriber];
return [RACDisposable disposableWithBlock:^{
[operation cancel];
}];
}];
}
将后面加上 replay 修改为即可解决:
- (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
NSURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:nil failure:nil];
RACSignal *signal = [operation rac_overrideHTTPCompletionBlock];
[self.operationQueue addOperation:operation];
[signal subscribe:subscriber];
return [RACDisposable disposableWithBlock:^{
[operation cancel];
}];
}] replay];
}
相关文章推荐
- httpUrlConnection的參数具体解释
- 人工智能AI-机器视觉CV-数据挖掘DM-机器学习ML-神经网络-[资料集合贴]
- 分布式系统中不可靠的TCP
- 深度神经网络算法的实现
- http://jackwang1.blog.163.com/blog/static/39534478201182651610201/
- httpClient中的get和post请求
- 鸟哥的Linux私房菜(服务器)- 第十二章、网络参数控管者: DHCP 服务器
- 鸟哥的Linux私房菜(服务器)- 第七章、网络安全与主机基本防护: 限制端口, 网络升级与 SELinux
- 鸟哥的Linux私房菜(服务器)- 第六章、 Linux 网络侦错
- 鸟哥的Linux私房菜(服务器)- 第五章、 Linux 常用网络指令
- 【转】TCP和UDP具体编程时的区别
- 鸟哥的Linux私房菜(服务器)- 第三章、局域网络架构简介
- 鸟哥的Linux私房菜(服务器)- 第二章、基础网络概念
- Java基于TCP/IP的Socket通信
- Workspace default 的JRE System Library与Project的JRE System Library http://blog.sina.com.cn/s/blog_65
- 请简要描述客户端发送的http request header都包含哪些内容
- HTTP get、post请求与post文件发生
- 在游览器上可以连网,Ionic打包后不能连接网络
- ubuntu下查找含有某关键字内容的文件(cp:http://www.2cto.com/os/201401/274076.html)
- HTTP相应状态