只是有几个值?
Just with several values?
我想要一个类似于 Just
的 Publisher,除了它应该发出多个值,然后完成流。
我们称它为JustSeveral
:
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
Future { ... }.eraseToAnyPublisher()
}
JustSeveral([293, 18, 104])
.flatMap { fibonacci([=10=]) }
.sink { print([=10=]) }
有没有办法将运算符与 Just
结合起来得到同样的东西,或者我需要自己构建这个 Publisher 吗?
注意:任何解决方案都应该能够处理数组中任意数量的元素,而不仅仅是 3 个。
例如,如果我们有一个 ,这将是微不足道的:
Just([293, 18, 104])
.uncollect { [=11=] }
.flatMap { fibonacci([=11=]) }
.sink { print([=11=]) }
更新:你应该使用.
原回答:
一个解决方案是 :
public struct JustSeveral<Value>: Publisher {
public init(_ outputs: [Value]) {
self.outputs = outputs
}
public var outputs: [Value]
public typealias Output = Value
public typealias Failure = Never
public func receive<Downstream: Subscriber>(subscriber: Downstream) where Downstream.Input == Output, Downstream.Failure == Failure {
let subject = PassthroughSubject<Value, Never>()
subject
.subscribe(subscriber)
outputs.forEach { subject.send([=10=]) }
subject.send(completion: .finished)
}
}
虽然这可行,但我不知道它是否是最佳解决方案,因为它只在订阅时发出值。我不确定 Just
是这样工作的。
导入 Combine
扩展 Array
计算 属性 称为 publisher
,returns 一个 Sequence<Array<Int>, Never>
,一个 Publisher
。所以你可以这样做:
[293, 18, 104]
.publisher
.flatMap { fibonacci([=10=]) }
.sink { print([=10=]) }
但是,Apple 的 API 文档大打折扣,我不认为有一个页面可以记录 Array.publisher
。
我想要一个类似于 Just
的 Publisher,除了它应该发出多个值,然后完成流。
我们称它为JustSeveral
:
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
Future { ... }.eraseToAnyPublisher()
}
JustSeveral([293, 18, 104])
.flatMap { fibonacci([=10=]) }
.sink { print([=10=]) }
有没有办法将运算符与 Just
结合起来得到同样的东西,或者我需要自己构建这个 Publisher 吗?
注意:任何解决方案都应该能够处理数组中任意数量的元素,而不仅仅是 3 个。
例如,如果我们有一个
Just([293, 18, 104])
.uncollect { [=11=] }
.flatMap { fibonacci([=11=]) }
.sink { print([=11=]) }
更新:你应该使用
原回答:
一个解决方案是
public struct JustSeveral<Value>: Publisher {
public init(_ outputs: [Value]) {
self.outputs = outputs
}
public var outputs: [Value]
public typealias Output = Value
public typealias Failure = Never
public func receive<Downstream: Subscriber>(subscriber: Downstream) where Downstream.Input == Output, Downstream.Failure == Failure {
let subject = PassthroughSubject<Value, Never>()
subject
.subscribe(subscriber)
outputs.forEach { subject.send([=10=]) }
subject.send(completion: .finished)
}
}
虽然这可行,但我不知道它是否是最佳解决方案,因为它只在订阅时发出值。我不确定 Just
是这样工作的。
导入 Combine
扩展 Array
计算 属性 称为 publisher
,returns 一个 Sequence<Array<Int>, Never>
,一个 Publisher
。所以你可以这样做:
[293, 18, 104]
.publisher
.flatMap { fibonacci([=10=]) }
.sink { print([=10=]) }
但是,Apple 的 API 文档大打折扣,我不认为有一个页面可以记录 Array.publisher
。