try .max(10) !! It will be clear immediately :-) For further reading see ios - Combine framework serialize async operations - Stack Overflow
Publishers.Zip
A publisher created by applying the zip function to two upstream publishers.
Because default Subscribers.Demand == .unlimited, sink will consume all values till end of each of two zipped publishers. One value only from subject, but Int.max values from sequencePublisher.
Solution is clear now!
There is another question .. Why Apple guys named parameter of .flatMap operator maxPublishers, if .zip works with exactly two publishers. It is the source of confusion and misunderstanding how it works.
Finally try
let handle = subject
.zip(sequencePublisher.print()).collect(5)
//.publish
.flatMap(maxPublishers: .max(1), { (pair) in
Just(pair)
})
.print()
handle.sink { v in//letters, digits in
print(v)//print(letters, digits)
}
it gives you
receive subscription: (FlatMap)
request unlimited
receive subscription: (0..<9223372036854775807)
request max: (5)
receive value: (0)
receive value: (1)
receive value: (2)
receive value: (3)
receive value: (4)
receive value: ([("H", 0), ("e", 1), ("l", 2), ("l", 3), ("o", 4)])
[("H", 0), ("e", 1), ("l", 2), ("l", 3), ("o", 4)]
request max: (5)
receive value: (5)
receive value: (6)
receive value: (7)
receive value: (8)
receive value: (9)
receive value: ([(" ", 5), ("W", 6), ("o", 7), ("r", 8), ("l", 9)])
[(" ", 5), ("W", 6), ("o", 7), ("r", 8), ("l", 9)]
request max: (5)
receive value: (10)
receive value: (11)
receive value: (12)
receive value: (13)
receive value: (14)
receive cancel
receive value: ([("d", 10), ("!", 11)])
[("d", 10), ("!", 11)]
receive finished
Try another example, with a little bit "better" print formating
let subject = PassthroughSubject<Int,Never>()
let sequence = Publishers.Sequence<Range<Int>, Never>(sequence: 0 ..< 10)
subject.zip(sequence.print("sequence")).print("zip").sink { (pair) in
print("zipped", pair)
}
subject.zip(sequence.print(" sequence")).print(" zip").flatMap(maxPublishers: .max(1)) { Just($0) }.sink { (v) in
print(" flatMapped",v)
}
subject.send(1)
it produce the next
sequence: receive subscription: (0..<10)
zip: receive subscription: (Zip)
zip: request unlimited
sequence: request unlimited
sequence: receive value: (0)
sequence: receive value: (1)
sequence: receive value: (2)
sequence: receive value: (3)
sequence: receive value: (4)
sequence: receive value: (5)
sequence: receive value: (6)
sequence: receive value: (7)
sequence: receive value: (8)
sequence: receive value: (9)
sequence: receive finished
sequence: receive subscription: (0..<10)
zip: receive subscription: (Zip)
zip: request max: (1)
sequence: request max: (1)
sequence: receive value: (0)
zip: receive value: ((1, 0))
zipped (1, 0)
zip: receive value: ((1, 0))
flatMapped (1, 0)
zip: request max: (1)
sequence: request max: (1)
sequence: receive value: (1)
zip: receive cancel
sequence: receive cancel
zip: receive cancel
sequence: receive cancel