2016-02-12 89 views
0

假設您正在觀察頻繁更改的屬性,例如當它低於閾值時應該重新填充的隊列?如何在執行其他事件時忽略事件?

queue.rac_valuesForKeyPath("count", observer: self) 
    .toSignalProducer() 
    .filter({ (queueCount: AnyObject?) -> Bool in 
    let newQueueCount = queueCount as! Int 
    return newQueueCount < 10 
    }) 
    .on(next: { _ in 
    // Refilling the queue asynchronously and takes 10 seconds 
    self.refillQueue(withItemCount: 20) 
    }) 
    .start() 

當隊列爲空時,下一個處理程序將被觸發並填充隊列。填充隊列時,SignalProducer會發送一個新的下一個事件,因爲count屬性更改爲1 - 另一個。但我不希望下一個處理程序被觸發。相反,我希望每當隊列低於該閾值時觸發一次。

我該如何以最好的方式做到這一點?有沒有有用的事件流操作?有任何想法嗎?

乾杯,

赫拉爾

回答

0

我認爲你可以在這裏使用combinePrevios運營商,因爲它給你的現在和前值:

queue.rac_valuesForKeyPath("count", observer: self) 
    .toSignalProducer() 
    .combinePrevious(0) 
    .filter { (previous, current) -> Bool in 
    return previous >= 10 && current < 10 
    } 
    .on(next: { _ in 
    // Refilling the queue asynchronously and takes 10 seconds 
    self.refillQueue(withItemCount: 20) 
    }) 
    .start() 

另一種方法是filter後加入skipRepeats()在你的原始代碼中,但我認爲combinePrevious在這種特殊情況下更明確。