我正在尝试实现代码,因此我可以序列化网络请求,基本上,下一个请求应该在第一个请求完成后才开始。我也想订阅这些请求,所以我可以处理错误。代码如下所示:
- (RACSignal * ) sendRequest: (Request *) request{
[[[RACSignal return:nil
deliverOn: [RACScheduler scheduler]
mapReplace: [self.network sendRequest]]; // A different thread is spawned to execute the request
}
,它被称为:
[self sendRequest:request
subscribeNext: ^(id x) {
NSLog(@"Request has been sent");
}];
请注意,可以从多个线程并行调用sendRequest
,因此需要对请求进行排队。
将请求放在同一个调度程序上,不起作用,因为发送发生在另一个线程上,下一个请求在上一个请求完成之前被拾取。
我还研究了使用RACSubject
来帮助缓冲请求,但这对于火灾和遗忘都是有好处的。
答案 0 :(得分:0)
我能够使用concat
命令实现上述功能,因此它类似于:
- (RACSignal * ) sendRequest: (Request *) request subscriber:(id<RACSubscriber>) subscriber{
[[[RACSignal return:nil
deliverOn: [RACScheduler scheduler]
flattenMap:^RACStream *(id value) {
[self.network sendRequest]]; // A different thread is spawned to execute the request
}]
doNext: ^(id x) {
[subscriber sendNext];
}
[[self sendRequest:request
concat]
subscribeNext: ^(id x) {
NSLog(@"Request has been sent");
}];
答案 1 :(得分:0)
事实证明NSOperationQueue
是不可避免的。
我已经RACSerialCommand来序列化命令执行。它有一个类似于RACCommand的接口,但内置NSOperationQueue
来序列化执行。
随意尝试。