轉(zhuǎn)載自: http://blog.csdn.net/lgm252008/article/details/50736950
在RAC實(shí)際使用時(shí)發(fā)現(xiàn)RAC有一個(gè)在網(wǎng)絡(luò)請(qǐng)求上很?chē)?yán)重的問(wèn)題战坤,就是同一個(gè)網(wǎng)絡(luò)url刷新時(shí)所創(chuàng)建的信號(hào)源
內(nèi)部請(qǐng)求會(huì)被執(zhí)行兩次或多次的現(xiàn)象靶端,通過(guò)代理Charles很容易看到,查了相關(guān)資料有說(shuō)過(guò)該問(wèn)題但大多數(shù)并沒(méi)有直接指出應(yīng)怎么處理募狂,
現(xiàn)將
AFHTTPRequestOperationManager和 AFHTTPSessionManager相關(guān)代碼如下(得修改原碼)
- (RACSignal *)rac_requestPath:(NSString *)path parameters:(id)parameters method:(NSString *)method {
return [RACSignal createSignal:^(id 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 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];
}