CombineCommunity / RxCombine

Bi-directional type bridging between RxSwift and Apple's Combine framework
MIT License
1.03k stars 86 forks source link

Bridging RxSwift to SwiftUI #4

Open jlevine22 opened 5 years ago

jlevine22 commented 5 years ago

Haven't really been able to test this out as I've been fighting with Xcode 11 and just some general bugginess but here's a first stab at this:

class Bound<Value>: BindableObject {
    let bag = DisposeBag()

    var value: Value {
        didSet {
            didChange.send(value)
        }
    }

    let didChange = PassthroughSubject<Value, Never>()

    init(_ value: Value) { self.value = value }
}

extension Observable {
    func asBindableObject(initialValue: Element) -> Bound<Element> {
        let bound = Bound(initialValue)
        subscribe(onNext: { [weak bound] in bound?.value = $0 }).disposed(by: bound.bag)
        return bound
    }
}

Thoughts?

jlevine22 commented 5 years ago

Just to follow up, I was able to use this successfully in this example project here: https://github.com/jlevine22/rxswift-to-swiftui

freak4pc commented 5 years ago

Hey there! Thanks, I'll take a deeper look throughout the week :)

freak4pc commented 4 years ago

@jlevine22 Only took me 6 months to get to this :( So sorry, it's been a bit hectic. The basic concepts outlined in your repo look promising! Would you want to make a more thorough PR with these capabilities?

ivnsch commented 4 years ago

Any updates on this?

freak4pc commented 4 years ago

Happy to accept a more fleshed out PR to look at. I personally don't have the time to look into it ATM :)