«PassthroughSubject» кажется поточно-небезопасным, это ошибка или ограничение? - PullRequest
1 голос
/ 24 июня 2019

"PassthroughSubject" кажется небезопасным.Пожалуйста, смотрите код ниже, я отправляю 100 значений одновременно подписчику, который запрашивает только .max(5).Я думаю, что подписчик должен получить только 5 значений, но на самом деле он получил больше.Это ошибка или ограничение?

// Xcode11 beta2

var count = 0
let q = DispatchQueue(label: UUID().uuidString)
let g = DispatchGroup()

let subject = PassthroughSubject<Int, Never>()
let subscriber = AnySubscriber<Int, Never>(receiveSubscription: { (s) in
    s.request(.max(5))
}, receiveValue: { v in
    q.sync {
        count += 1
    }
    return .none
}, receiveCompletion: { c in
})
subject.subscribe(subscriber)

for i in 0..<100 {
    DispatchQueue.global().async(group: g) {
        subject.send(i)
    }
}

g.wait()
print("receive", count)  // expected 5, but got more(7, 9...)

1 Ответ

1 голос
/ 24 июня 2019

Я полагаю, вы ищете оператора prefix :

/// Republishes elements up to the specified maximum count.
func prefix(Int) -> Publishers.Output<PassthroughSubject<Output, Failure>>

Оператор max возвращает наибольшее значение при завершении (и возможно, вы запускаете завершение более одного раза):

/// Publishes the maximum value received from the upstream publisher, after it finishes.
/// Available when Output conforms to Comparable.
func max() -> Publishers.Comparison<PassthroughSubject<Output, Failure>>

...