在 Combine 中,您如何创建一个发送一个值但从未完成的发布者?

Posted

技术标签:

【中文标题】在 Combine 中,您如何创建一个发送一个值但从未完成的发布者?【英文标题】:In Combine how do you make a publisher that sends one value but never completes? 【发布时间】:2020-05-26 04:07:56 【问题描述】:

在下面的代码中,receiveCompletion 被调用,但我不希望它:

Just(1)
    .sink(
        receiveCompletion: 
            print("Completion: \($0)")
    ,
        receiveValue: 
            print("Value: \($0)")
    
)

我怎样才能只发出一个值但不完整...?

【问题讨论】:

【参考方案1】:

您可以将Empty(completeImmediately: false) 附加到任何发布者以防止其正常完成。

Just(1)
    .append(Empty(completeImmediately: false))
    .sink(
        receiveCompletion:  print("completion: \($0)") ,
        receiveValue:  print("value: \($0)") )

【讨论】:

【参考方案2】:

可能有一些更好的方法,但CurrentValueSubject 永远不会碰它的value,会按您的预期工作:

let publisher = CurrentValueSubject<Int, Never>(1)

publisher
    .sink(
        receiveCompletion: 
            print("Completion: \($0)")
    ,
        receiveValue: 
            print("Value: \($0)")
    
)

输出:

Value: 1

【讨论】:

以上是关于在 Combine 中,您如何创建一个发送一个值但从未完成的发布者?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Combine 中最好地创建 @Published 值的发布者聚合?

我如何使用Combine来跟踪UIViewRepresentable类中的UITextField更改?

Swift Combine:缓冲上游值并以稳定的速率发出它们?

jquery textarea 设置值但 \n 不起作用

通过 httpget 发送 cookie 值但没有得到所需的响应

链表创建一个新指针以添加值但不起作用