Combine 中有(除其他外)这两个发布商:
let just = Just("Just")
let future = Future<String, Never>({ (promise) in
DispatchQueue.main.async {
promise(.success("Future"))
}
})
当将这两个放入 combineLatest
发布者中时,会有不同的输出,如下所示
just.combineLatest([1,2,3].publisher).sink { (value) in
print(value)
}.store(in: &bin)
/* prints
("Just", 1)
("Just", 2)
("Just", 3)
*/
future.combineLatest([1,2,3].publisher).sink { (value) in
print(value)
}.store(in: &bin)
/* prints:
("Future", 3)
*/
是否有任何方法可以修改(例如运算符(operator))Future
发布商,使其表现得像Just
发布商?
最佳答案
Future
当您调用 combineLatest
时,行为没有什么不同在上面。由于您在 Future
中添加的异步调度,您的示例存在缺陷。 .
combineLatest
仅当其所有上游都发出值时才发出值。因此,如果您添加 DispatchQueue.main.async
在你打电话之前promise
在你的Future
里面,您将延迟 Future
中的发射。正因为如此,Future
将晚于 Array.publisher
发出因此,您只会看到 combineLatest
的 1 个(有时是 0 个,具体取决于主线程上的下一个运行循环的执行时间)输出。 .
一旦删除异步调用,您就会看到 Future
的相同输出和Just
.
var subscriptions = Set<AnyCancellable>()
let just = Just("Just")
let future = Future<String, Never> { promise in
promise(.success("Future"))
}
just.combineLatest([1,2,3].publisher).sink { (value) in
print(value)
}.store(in: &subscriptions)
future.combineLatest([1,2,3].publisher).sink { (value) in
print(value)
}.store(in: &subscriptions)
关于swift - mixLatest 在 Just 与 Future 中具有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64103509/