ReactiveSwift испускает элементы из массива с задержкой между элементами

Допустим, у меня есть массив элементов [1, 2, 3] и задержка 5 секунд.

Я хочу испускать каждый элемент массива с паузой между испускаемым текущим элементом и следующим.

Пример:

Выход:

[00:00] -- 1
[00:05] -- 2
[00:10] -- 3

Я пытался сделать следующее:

import ReactiveSwift

let startTime     = DispatchTime.now().uptimeNanoseconds
let arrayProperty = MutableProperty<[Int]>([1, 2, 3])
let arraySignal   = arrayProperty.signal
arraySignal
    .flatMap { $0 }
    .delay(2, on: QueueScheduler.main)
    .observeValues { element in
        let elapsed = DispatchTime.now().uptimeNanoseconds
        print("\((elapsed - startTime) / 1_000_000_000) -- \(element)")
    }

Но он только задерживает испускание первого элемента и немедленно испускает следующие.

Я не смог найти подходящую комбинацию операторов для использования, возможно, они отсутствуют в среде ReactiveSwift, и я новичок в программировании Reactive, поэтому реализация моего собственного оператора пока слишком сложна.


person Tylerian    schedule 17.09.2018    source источник


Ответы (1)


У меня не было возможности попробовать этот код, но он должен быть примерно таким:

SignalProducer([1, 2, 3])
    .flatMap(.concat) { n in
        return SignalProducer(value: n).delay(2, on: QueueScheduler.main)
    }
    .startWithValues { element in
        let elapsed = DispatchTime.now().uptimeNanoseconds
        print("\((elapsed - startTime) / 1_000_000_000) -- \(element)")
    }

Суть в том, что вы используете flatMap для создания нового производителя сигнала для каждого значения, к которому вы можете применить задержку, и комбинируете их со стратегией .concat сглаживания.

(Кроме того, обратите внимание, что вы можете использовать инициализатор производителя сигнала, который принимает последовательность)

person jjoelson    schedule 17.09.2018