Saya ingin Penerbit yang mirip dengan Just kecuali harus memancarkan beberapa nilai, lalu menyelesaikan streaming.

Sebut saja JustSeveral:

func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
  Future { ... }.eraseToAnyPublisher()
}

JustSeveral([293, 18, 104])
  .flatMap { fibonacci($0) }
  .sink { print($0) }

Apakah ada cara untuk menggabungkan operator dengan Just untuk mendapatkan hal yang sama, atau apakah saya perlu membangun Publisher ini sendiri?

Catatan: Solusi apa pun harus dapat menangani sejumlah elemen dalam array, bukan hanya 3.


Misalnya, jika kami memiliki uncollect operator, ini akan menjadi sepele:

Just([293, 18, 104])
  .uncollect { $0 }
  .flatMap { fibonacci($0) }
  .sink { print($0) }
0
Senseful 13 Mei 2021, 20:21

2 jawaban

Jawaban Terbaik

Mengimpor Combine memperluas Array dengan properti komputer yang disebut publisher, yang mengembalikan Sequence<Array<Int>, Never>, yang merupakan Publisher. Jadi Anda cukup melakukan:

[293, 18, 104]
    .publisher
    .flatMap { fibonacci($0) }
    .sink { print($0) }

Namun, dokumentasi API Apple sangat sulit, dan saya rasa tidak ada halaman yang mendokumentasikan Array.publisher.

2
Alexander 13 Mei 2021, 17:32

Pembaruan: Anda harus menggunakan metode .publisher bawaan.


Jawaban asli:

Salah satu solusinya adalah membuat penerbit menunggu sampai ada langganan dan kemudian memancarkan nilai:

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($0) }
    subject.send(completion: .finished)
  }
}

Meskipun ini berhasil, saya tidak tahu apakah itu solusi terbaik karena hanya memancarkan nilai saat berlangganan. Saya tidak yakin begitulah cara Just bekerja.

0
Senseful 13 Mei 2021, 17:43