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()
}