ReactiveSwift испускает элементы из массива с задержкой между элементами - PullRequest
0 голосов
/ 17 сентября 2018

Допустим, у меня есть массив элементов [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, поэтому реализовать собственный оператор пока слишком сложно.

1 Ответ

0 голосов
/ 18 сентября 2018

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

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 flatten.

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

...