Skip to content

Instantly share code, notes, and snippets.

@Odrakir
Created July 7, 2016 09:33
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Odrakir/abf64b0712ec7348e30d960d22960830 to your computer and use it in GitHub Desktop.
Save Odrakir/abf64b0712ec7348e30d960d22960830 to your computer and use it in GitHub Desktop.
ReSwift + Rx
import Foundation
import RxSwift
public class RxStore: StoreSubscriber {
private var stateObservable:Observable<AppState> {
return subject.asObserver()
.shareReplay(1)
}
private var subject = PublishSubject<AppState>()
private var store: Store<AppState>
init(store: Store<AppState>) {
self.store = store
self.store.subscribe(self)
}
deinit {
self.store.unsubscribe(self)
}
public func newState(newState: AppState) {
subject.onNext(newState)
}
public func state<S:Equatable>(mapState:(AppState)->S) -> Observable<S>
{
return stateObservable
.map(mapState)
.distinctUntilChanged()
}
}
var store = Store<AppState>(reducer: AppReducer(), state: nil, middleware: [rxMiddleware, loggingMiddleware])
var rxStore = RxStore(store: store)
rxStore.state { $0.userState }
.subscribeNext {
print("user: \($0.user)")
}
}
@bradphilips
Copy link

Hey @Odrakir, what is the reasoning behind the distinctUntilChanged() operator and requiring everything in state to be Equatable? Is this required?

@DivineDominion
Copy link

DivineDominion commented Aug 7, 2017

Am using a reactive store extension in my project instead to great success. Exposes store.rx.state. Maybe you want to try that out, too:

//  Copyright © 2017 Christian Tietze. All rights reserved. Distributed under the MIT License.

import ReSwift
import RxSwift

extension ReSwift.Store: ReactiveCompatible { }

extension Reactive where Base: ReSwift.StoreType {

    var state: Observable<Base.State> {
        return Observable.create { observer in
            let subscriber = ReactiveStoreSubscriber<Base.State>()
            self.base.subscribe(subscriber)

            let forward = subscriber.state.subscribe(observer)
            let cancel = Disposables.create {
                self.base.unsubscribe(subscriber)
            }

            return Disposables.create(forward, cancel)
        }
    }
}

fileprivate class ReactiveStoreSubscriber<S>: StoreSubscriber {

    internal typealias StoreSubscriberStateType = S

    fileprivate let subject = PublishSubject<S>()

    internal var state: Observable<S> {
        return subject.asObservable()
    }

    func newState(state: StoreSubscriberStateType) {

        self.subject.onNext(state)
    }
}

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