【发布时间】:2021-12-24 19:24:16
【问题描述】:
我使用 RxSwift 已经有一段时间了,刚刚切换到 Combine,我正试图围绕这个特定的 .filter 行为。这是一个简短的游乐场示例:
import Combine
let publisher = [1, 2, 3, 4, 5]
.publisher
.share()
let filter1 = publisher
.filter { $0 == 1 }
.print("filter1")
let filter2 = publisher
.filter { $0 == 2 }
.print("filter2")
Publishers
.Merge(filter1, filter2)
.sink {
print("Result is: \($0)")
}
输出是
filter1: receive subscription: (Multicast)
filter1: request unlimited
filter1: receive value: (1)
Result is: 1
filter1: receive finished
filter2: receive subscription: (Multicast)
filter2: request unlimited
filter2: receive finished
令我惊讶的是,Result is: 2 从未被调用,因为流结束了。我可以删除 .share() 运算符,这将导致接收到我期望的两个值
filter1: receive subscription: ([1])
filter1: request unlimited
filter1: receive value: (1)
Result is: 1
filter1: receive finished
filter2: receive subscription: ([2])
filter2: request unlimited
filter2: receive value: (2)
Result is: 2
filter2: receive finished
但是如果我的发布者是一个 API 调用并且我不想创建重复的网络请求怎么办?这正是我现在要处理的情况,这也是我需要使用.share() 运算符的原因。
有什么更好的解释为什么会发生这种情况以及如何处理您想要过滤流、在每个流中执行单独的逻辑然后将结果重新合并在一起的情况?
【问题讨论】:
标签: ios asynchronous rx-swift combine