2017-02-20 6 views
0

Есть ли способ с RxSwift подписаться на метод, который возвращает блок завершения?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() 

Будет ли простое решение?

ответ

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, спасибо.

Смежные вопросы