Jest to uproszczenie tego, co próbuję osiągnąć przy użyciu kombajnu.
Muszę wstrzyknąć wartość do wspólnego wydawcy, jeśli coś się dzieje. Tutaj widzisz, że jeśli numer 2 zostanie odebrany przez mapę, używam polecenia Wyślij na oryginalnym wydawcy, aby wstrzyknąć numer 3.
Spodziewałbym się otrzymać sekwencję numeru, ale zamiast tego otrzymuję numer 3 przed wydarzeniem, który go uruchomił.

let pub = PassthroughSubject<Int, Never>()

let pubSharered = pub.share().eraseToAnyPublisher()

let anyCanc = pubSharered
.map { value -> Int in
        switch value {
        case 2:
            pub.send(3)
            return value
        default:
            return value
        }
}.sink { (value) in
    print("Sink: \(value)")
}

pub.send(0)
pub.send(1)
pub.send(2)
pub.send(4)

Wyjście to: 0,1,3,2,4 Co spodziewałem się 0,1,2,3,4.
Czy ktoś może to wyjaśnić?

1
Andrea 20 lipiec 2020, 08:34

1 odpowiedź

Najlepsza odpowiedź

Wydaje się, że jest to przypadek użycia dla flatMap. Możesz płaską mapę do Publishers.Sequence<[Int], Never> w ten sposób:

let anyCanc = pubSharered
    .flatMap { value -> Publishers.Sequence<[Int], Never> in
        switch value {
        case 2:
            return [value, 3].publisher // value, plus a 3
        default:
            return [value].publisher // change nothing
        }
}.sink { (value) in
    print("Sink: \(value)")
}
2
Sweeper 20 lipiec 2020, 05:53