2014-10-02 179 views
0

我想創建一個隊列,可以將塊添加到並開始處理; 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

我有一個類似的要求,我能夠實現這個使用「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) 
    {}] 

我還沒有嘗試上述,但我認爲它應該工作。