我想创建一个队列,我可以添加块并在一个属性时开始处理; isReady是真的。我可以用NSOperationQueue和NSBlockOperation做到这一点,但我很乐意看到只用ReactiveCocoa完成一个实现。我怎么能这样做?
块应按添加顺序排除,并且可以随时添加新块。
- (void)processQueueWhenReady
{
[[[RACObserve(self, isReady) filter:^BOOL(NSNumber *isReady) {
return [isReady boolValue];
}] take:1] subscribeNext:^(id x) {
[operationQueue setSuspended:NO];
}];
}
- (void)addTaskToQueue:(void (^)(void))task
{
[operationQueue addOperation:[NSBlockOperation blockOperationWithBlock:task]];
}
答案 0 :(得分:0)
我有类似的要求,我能够使用" concat"命令,concat,在内部维护一个队列。所以,上面的内容可以实现为
@weakify(self);
[[[self rac_signalForSelector:@selector(addTaskToQueue:) takeUntil:objectDeallocated]
reduceEach: ^ RACSignal *(Task * task)] {
@strongify(self);
return [self performTaskWhenReady:task];
}
concat] subscribeNext: ^id(x) { }];
- (void) performTaskWhenReady : (Task *) task {
@weakify(self);
[[[RACObserve(self, isReady] ignore:@(NO)] take:1]
flattenMap:^RACStream * (id *x) {
[task execute];
}] subscribeNext: ^ id(x) {}]
}
如果您只想等待一次isReady,您可以考虑使用skipUntil,因为这也会对请求进行排队。
[[[RACObserve(self, isReady] ignore:@(NO)] take:1]
skipUntilBlock: ^BOOL(id x) {
return isReady;
}
flattenMap: ^RACStream * (Task * task) {
[task execute];
}]
subscribeNext: ^ id(x)
{}]
我还没有尝试过上述内容,但我认为它应该可行。