“ PassthroughSubject”似乎是线程不安全的,这是错误还是限制?

时间:2019-06-24 07:34:08

标签: swift combine

“ PassthroughSubject”似乎是线程不安全的。请参见下面的代码,我正在同时向仅请求.max(5)的订阅者发送100个值。我认为订户应该只获得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 个答案:

答案 0 :(得分:1)

我相信您正在寻找$ awk ' { rec = (NR>1 ? rec ORS : "") $0 } END { gsub(/.*"subGroups":[^]}]*"id":"|".*/,"",rec) print rec } ' file 343534-394b-429a-834e-f8774240d736 operator

prefix

/// Republishes elements up to the specified maximum count. func prefix(Int) -> Publishers.Output<PassthroughSubject<Output, Failure>> 运算符在完成时返回最大值(并且您可能多次触发完成):

max