队列准备好后阻塞并执行队列

时间:2014-10-02 12:22:27

标签: reactive-cocoa

我想创建一个队列,我可以添加块并在一个属性时开始处理; 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]];
}

1 个答案:

答案 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) 
   {}]

我还没有尝试过上述内容,但我认为它应该可行。