【问题标题】:RxSwift - subscribe to a methodRxSwift - 订阅一个方法
【发布时间】:2017-02-20 19:48:45
【问题描述】:

RxSwift 有没有办法订阅返回完成块的方法?

例如,让我们拥有这个对象:

struct Service {

    private var otherService = ...
    private var initSucceeded = PublishSubject<Bool>()

    var initSucceededObservale: Observable<Bool> {
        return initSucceeded.asObservable()
    }

    func init() {
        otherService.init {(success) in
            self.initSucceeded.onNext( success)
        }
    }
}

并且在不同的地方有一种方法可以在服务初始化时得到通知:

service.initSucceededObservable.subscribe(onNext: {
    [unowned self] (value) in
    ...
}).addDisposableTo(disposeBag)

service.init()

会有更简单的解决方案吗?

【问题讨论】:

    标签: ios swift rx-swift


    【解决方案1】:

    我喜欢在这类事情上使用变量。另外,我建议在这里使用类,因为您正在跟踪独特的状态,而不仅仅是关注自己的值。

    class Service {
        private let bag = DisposeBag()
        public var otherService: Service?
    
        private var isInitializedVariable = Variable<Bool>(false)
    
        public var isInitialized: Observable<Bool> {
            return isInitializedVariable.asObservable()
        }
    
        public init(andRelyOn service: Service? = nil) {
            otherService = service
    
            otherService?.isInitialized
                .subscribe(onNext: { [unowned self] value in
                    self.isInitializedVariable.value = value
                })
                .addDisposableTo(bag)
        }
    
        public func initialize() {
            isInitializedVariable.value = true
        }
    
    }
    
    var otherService = Service()
    var dependentService = Service(andRelyOn: otherService)
    
    dependentService.isInitialized
                    .debug()
                    .subscribe({
                        print($0)
                    })
    
    otherService.initialize() // "Initializes" the first service, causing the second to set it's variable to true.
    

    【讨论】:

      【解决方案2】:

      你可以使用惰性属性:

      lazy let initSucceededObservale: Observable<Bool> = {
          return Observable.create { observer in
              self.otherService.init {(success) in
                  observer.on(.next(success))
                  observer.on(.completed)
              }
              return Disposables.create()
          }
      }()
      

      然后你可以使用:

      service.init()
      service.initSucceededObservable.subscribe(onNext: {
          [unowned self] (value) in
          ...
      }).addDisposableTo(disposeBag)
      

      如果您在投票前遇到问题,请在 cmets 中告诉我,谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2020-12-06
        • 2018-01-01
        相关资源
        最近更新 更多