2017-02-20 7 views
0

完了ブロックを返すメソッドにRxSwiftが加入する方法はありますか?RxSwift - メソッドを購読する

例は、のは、このオブジェクトを持ってみましょう:

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

service.init() 

が簡単な解決策のようになります。

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) 
     } 
    } 
} 

、異なる場所では、サービスが初期化されたときに通知する方法はありますか?

答えて

0

私はこの種のものに変数を使用するのが好きです。また、ここでクラスを使うことをお勧めします

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. 
0

あなたは怠惰なプロパティを使用することができます

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) 

あなたは、感謝をdownvoting前に、問題がある場合、私はコメントで教えてください。

関連する問題