Как я могу привести currentValueSubject к неизменяемой наблюдаемой? - PullRequest
0 голосов
/ 17 марта 2020

Так что я гораздо лучше знаком с RxSwift, чем Combine. Хороший способ управления изменяемыми / неизменяемыми интерфейсами заключается в том, что я делаю что-то подобное в RxSwift


protocol SampleStream {
   /// An immutable interface. 
   var streamInfo: Observable<String?> { get} 
}

protocol MutableSampleStream: SampleStream {
   /// A mutable interface. 
   func updateStream( _ val: String?)
}

func SampleStreamImpl: MutableSampleStream {

   // Returns the immutable version of the stream.
   // If I pass down SampleStream as a dependency, then nothing else can write to this stream.
   // When they subscribe, they immediately get a value though since it's a behavior subject. 
   var streamInfo: Observable<String?> {
      return streamInfoSubject.asObservable()
   }

   private var streamInfoSubject = BehaviorSubject<String?>(value: nil) 

   func updateStream { }
}

Как я могу сделать что-то подобное, используя Combine? У currentValueSubject комбайна, похоже, нет способа привести его к нечитаемой версии записи. Или я что-то упустил?

В моем приложении я не хочу напрямую передавать currentValueSubject, поскольку я точно знаю, что хочу, чтобы этот поток обновлялся только из одного места. В другом месте следует просто читать из потока и не иметь возможности записи.

1 Ответ

0 голосов
/ 17 марта 2020

Используйте AnyPublisher в качестве неизменяемого типа:

protocol SampleStream {
    var streamInfo: AnyPublisher<String?, Error> { get }
}

protocol MutableSampleStream: SampleStream {
    func updateStream(_ val: String?)
}

class MySampleStream: MutableSampleStream {
    var streamInfo: AnyPublisher<String?, Error> {
         return subject.eraseToAnyPublisher()
    }

    func updateStream(_ val: String?) { subject.send(val) }

    private let subject = CurrentValueSubject<String?, Error>(nil)
}
...