Swift Empty()发布服务器不发送完成信息
在这段代码中,我希望Swift Empty()发布服务器不发送完成信息,swift,combine,Swift,Combine,在这段代码中,我希望Empty()发布者向.sink订阅者发送完成信息,但不发送完成信息 func testEmpty () { let x = XCTestExpectation() let subject = PassthroughSubject<Int, Never>() emptyOrSubjectPublisher(subject).sink(receiveCompletion: { completion in dump(comp
Empty()
发布者向.sink
订阅者发送完成信息,但不发送完成信息
func testEmpty () {
let x = XCTestExpectation()
let subject = PassthroughSubject<Int, Never>()
emptyOrSubjectPublisher(subject).sink(receiveCompletion: { completion in
dump(completion)
}, receiveValue: { value in
dump(value)
}).store(in: &cancellables)
subject.send(0)
wait(for: [x], timeout: 10.0)
}
func emptyOrSubjectPublisher (_ subject: PassthroughSubject<Int, Never>) -> AnyPublisher<Int, Never> {
subject
.flatMap { (i: Int) -> AnyPublisher<Int, Never> in
if i == 1 {
return subject.eraseToAnyPublisher()
} else {
return Empty().eraseToAnyPublisher()
}
}
.eraseToAnyPublisher()
}
func testEmpty(){
设x=xctestexpection()
let subject=PassthroughSubject()
emptyOrSubjectPublisher(subject).sink(receiveCompletion:{completion in
转储(完成)
},receiveValue:{中的值
转储(值)
}).store(在:&可取消项中)
主题。发送(0)
等待(等待:[x],超时:10.0)
}
func emptyOrSubjectPublisher(\uSubject:PassthroughSubject)->AnyPublisher{
主题
.flatMap{(i:Int)->中的任何发布者
如果i==1{
返回subject.eraseToAnyPublisher()
}否则{
返回空()
}
}
.删除任何发布者()
}
为什么
emptyOrSubjectPublisher
没有收到完成信息?由于初始主题尚未完成,所以空的主题完成,但整个管道没有。生成空的内部管道(flatMap)已“吞没”完成。这是预期的行为
您只需在flatMap
中生成一个Just,就可以更容易地看到这一点,例如Just(100)
:
你知道,我也知道a只发射一次就完成了。但是,尽管价值刚刚到达管道,没有完成
你很容易就能明白为什么它是这样工作的。如果我们从我们的发行商那里得到了一系列潜在的价值,但某个中间发行商(以flatMap
制作)有能力完成整个流程并提前结束,那就大错特错了
(看看我的观点。)
如果目标是在管道中发送完成,则需要完成的是主题
。例如,你可以说
func emptyOrSubjectPublisher (_ subject: PassthroughSubject<Int, Never>) -> AnyPublisher<Int, Never> {
subject
.flatMap { (i: Int) -> AnyPublisher<Int, Never> in
if i == 1 {
return subject.eraseToAnyPublisher()
} else {
subject.send(completion: .finished) // <--
return Empty().eraseToAnyPublisher()
}
}
.eraseToAnyPublisher()
}
func-emptyOrSubjectPublisher(u-subject:PassthroughSubject)->AnyPublisher{
主题
.flatMap{(i:Int)->中的任何发布者
如果i==1{
返回subject.eraseToAnyPublisher()
}否则{
subject.send(完成:。已完成)//好的,现在更有意义了-谢谢你。也谢谢你的阅读材料!emptyOrSubjectPublisher
是一个仓促炮制的测试结构。没问题,很高兴看到大家对Combine框架感兴趣。你的问题很好!记住flatMap
行为的另一个更简单的方法是它反映了所有的值e向父发布服务器发送事件和故障,但未完成事件。@SlashDevSlashGnoll如我所说,请参阅
func emptyOrSubjectPublisher (_ subject: PassthroughSubject<Int, Never>) -> AnyPublisher<Int, Never> {
subject
.flatMap { (i: Int) -> AnyPublisher<Int, Never> in
if i == 1 {
return subject.eraseToAnyPublisher()
} else {
subject.send(completion: .finished) // <--
return Empty().eraseToAnyPublisher()
}
}
.eraseToAnyPublisher()
}