Skip to content

Instantly share code, notes, and snippets.

@dangthaison91
Last active August 11, 2021 07:29
Show Gist options
  • Save dangthaison91/914ee150bb7cf7171b4b82bdf3523477 to your computer and use it in GitHub Desktop.
Save dangthaison91/914ee150bb7cf7171b4b82bdf3523477 to your computer and use it in GitHub Desktop.
RxSwift Extension that support two way binding with Eureka.
extension RowOf: ReactiveCompatible {}
extension Reactive where Base: RowType, Base: BaseRow {
var value: ControlProperty<Base.Cell.Value?> {
let source = Observable<Base.Cell.Value?>.create { observer in
self.base.onChange { row in
observer.onNext(row.value)
}
return Disposables.create()
}
let bindingObserver = UIBindingObserver(UIElement: self.base) { (row, value) in
row.value = value
}
return ControlProperty(values: source, valueSink: bindingObserver)
}
}
@jcmendez
Copy link

@dangthaison91 - would you please show how this would be used?

@dangthaison91
Copy link
Author

dangthaison91 commented Aug 22, 2017

@jcmendez: Really sorry for didn't reply soon. for Eureka 3.0 and RxSwift 3.x you should go with this. I just refactor for my project today:

extension RowOf: ReactiveCompatible {}

extension Reactive where Base: RowType, Base: BaseRow {
    var value: ControlProperty<Base.Cell.Value?> {
        let source = Observable<Base.Cell.Value?>.create { observer in
            self.base.onChange { row in
                observer.onNext(row.value)
            }
            return Disposables.create()
        }
        let bindingObserver = UIBindingObserver(UIElement: self.base) { (row, value) in
            row.value = value
        }
        return ControlProperty(values: source, valueSink: bindingObserver)
    }
}

So you can easily do 2way-binding or get row's value via Rx extensions:

someRow.rx.value.bind(to: someVariable)
OR
someRow.rx.value <-> someVariable

@wsjorge
Copy link

wsjorge commented May 17, 2019

Can you do an update for this code to be compatible with the latest RxSwift. Variable is getting deprecated soon. thank you..

@AwayQu
Copy link

AwayQu commented Jan 18, 2020

@pual
Copy link

pual commented Aug 11, 2021

I found a memory leak, here's the fixed version:

extension Eureka.RowOf: ReactiveCompatible {}

extension Reactive where Base: Eureka.RowType, Base: Eureka.BaseRow {
    var value: ControlProperty<Base.Cell.Value?> {
        let source = Observable<Base.Cell.Value?>.create { [weak base] observer in
            if let _base = base {
                observer.onNext(_base.value)
                _base.onChange { row in
                    observer.onNext(row.value)
                    row.updateCell()
                }
            }
            return Disposables.create()
        }
        let bindingObserver = Binder(self.base) { (row, value) in
            row.value = value
        }
        return ControlProperty(values: source, valueSink: bindingObserver)
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment