1

Я пытаюсь обернуть голову вокруг рамки ReactiveCocoa, но я застрял в попытке выяснить, как отсрочить условно.Реактивная какао-условная задержка

Например, я хочу установить для свойства CADisplayLink pause значение false, когда массив пуст. Вот как я достиг этого:

RACSignal *changeSignal = [self rac_valuesAndChangesForKeyPath:@keypath(self, projectiles) options:NSKeyValueObservingOptionNew observer:nil]; 

RAC(self.displayLink, paused) = [changeSignal map:^id(RACTuple *value) { 
    return @([((NSMutableArray *)value.first) count] == 0); 
}]; 

Но прежде, чем приостановить связь дисплея, я хочу, чтобы сохранить анимацию в течение нескольких секунд, так что я добавил delay:2.5]; до конца блока карты.

Теперь я столкнулся с проблемой, что она ждет 2,5 секунды, чтобы остановить И начать ссылку на изображение. Я только хочу, чтобы RAC остановился, когда я устанавливаю self.displayLink.paused в YES, но не тогда, когда я устанавливаю его на NO.

Возможна ли эта «условная задержка» в ReactiveCocoa, и если да, то как это делается?

ответ

1

Я получил некоторую помощь на GitHub page for ReactiveCocoa:

Вы можете использовать -flattenMap: чтобы сделать это, так как это позволяет возвращать сигнал вместо только одно значение:

RAC(self.displayLink, paused) = [changeSignal flattenMap:^id(RACTuple *value) { 
    RACSignal *pauseSignal = [RACSignal return:@([((NSMutableArray *)value.first) count] == 0)]; 
    if (pause) { 
     return [pauseSignal delay:2.5]; 
    } else { 
     return pauseSignal; 
    } 
}]; 

Поэтому, когда мы останавливаемся, мы задерживаем 2,5 секунды, а затем останавливаемся. Когда мы снимаем, мы немедленно отправляем значение через

Смежные вопросы