项目作者: marty-suzuki

项目描述 :
A observer(or observable)-only `Dispatcher` that is used in Flux.
高级语言: Swift
项目地址: git://github.com/marty-suzuki/RxAnyDispatcher.git
创建时间: 2017-04-01T07:21:35Z
项目社区:https://github.com/marty-suzuki/RxAnyDispatcher

开源协议:MIT License

下载


RxAnyDispatcher

Data flow of Flux is single direction. When implementing Dispatcher with RxSwift, might be using PublishSubject. But PublishSubject is at once Observer and Observable. Therefore, an Action can subscribe dispatcher’s observables and a Store can observe on dispatcher’s observers. Those are in the reverse direction on data flow of Flux. So no need to be able to call those in each class.

flux.png

https://facebook.github.io/flux/

Ordinary Dispatcher sample

Implementing properties with PublishSubject.

  1. class SearchUserDispatcher {
  2. static let shared = SearchUserDispatcher()
  3. let loading = PublishSubject<Bool>()
  4. let error = PublishSubject<Error>()
  5. let searchUser = PublishSubject<(Int, SearchModel<User>)>()
  6. }

RxAnyDispatcher sample

Using associated values enum instead of properties.

  1. final class SearchUserDispatcher: Dispatchable {
  2. enum State {
  3. case loading(Bool)
  4. case error(Error)
  5. case searchUser(Int, SearchModel<User>)
  6. }
  7. static let shared = SearchUserDispatcher()
  8. let observerState: AnyObserver<State>
  9. let observableState: Observable<State>
  10. required init() {
  11. (self.observerState, self.observableState) = SearchUserDispatcher.properties()
  12. }
  13. }

Wrapping SearchUserDispatcher as AnyObserverDispatcher because no need to subscribe values in Action.

  1. class SearchUserAction {
  2. typealias Dispatcher = AnyObserverDispatcher<SearchUserDispatcher>
  3. static let shared = SearchUserAction()
  4. private let dispatcher: Dispatcher
  5. init(dispatcher: Dispatcher = AnyObserverDispatcher(.shared)) {
  6. self.dispatcher = dispatcher
  7. }
  8. func loading(_ value: Bool) {
  9. self.dispatcher.dispatch(.loading(value))
  10. }
  11. }

Wrapping SearchUserDispatcher as AnyObservableDispatcher because no need to observe values in Store.

  1. class SearchUserStore {
  2. typealias Dispatcher = AnyObservableDispatcher<SearchUserDispatcher>
  3. static let shared = SearchUserStore()
  4. let searchUser = Variable<SearchModel<User>>(SearchModel())
  5. let loading = Variable<Bool>(false)
  6. let error = PublishSubject<Error>()
  7. init(dispatcher: Dispatcher = AnyObservableDispatcher(.shared)) {
  8. dispatcher.subscribe(onNext: { [unowned self] in
  9. switch $0 {
  10. case .loading(let value):
  11. self.loading.value = value
  12. case .error(let value):
  13. self.error.onNext(value)
  14. case .searchUser(let value):
  15. if value.0 == 0 {
  16. self.searchUser.value = value.1
  17. } else {
  18. self.searchUser.value = self.searchUser.value.concat(searchModel: value.1)
  19. }
  20. }
  21. })
  22. .addDisposableTo(disposeBag)
  23. }
  24. }

License

RxAnyDispatcher is available under the MIT license. See the LICENSE file for more info.