Last active
July 12, 2019 02:40
-
-
Save GeekTree0101/80382610523512ac9e946d1edb2ed75b to your computer and use it in GitHub Desktop.
Marty MVVM
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class GlobalHook { | |
static let shared = GlobalHook() | |
var updateModel = PublishRelay<Model>() | |
} | |
protcol ViewModelProcotol { | |
func hook() | |
} | |
struct repository { | |
let store: ActionRelay<[Article]> | |
func fetch() -> Observable<[Article]> { | |
appService.request.map { $0.articles }.do(onNext: { [weak store] store?.accept($0) }) | |
} | |
func more() -> Observable<[Article]> { | |
appService.request.map { $0.articles }.do(onNext: { [weak store] in | |
var items = store?.value ?? [] | |
items.append($0) | |
store.accept(items) | |
}) | |
} | |
func itemsState() -> observable<[Article]> { | |
return store.asObservable() | |
} | |
} | |
class ViewModel: ViewModelProtocol { | |
let refresh = PublishRelay<Void>() | |
let more = PublishRelay<Void>() | |
var output: Observable<ViewState>() | |
private let converter = Converter() | |
let worker = CustomWorker() | |
init() { | |
output = worker.itemsState().asObservable() | |
refresh.flatMap { worker.fetch() } | |
more.flatMap { worker.more() } | |
hook() | |
} | |
func hook() { | |
GlobalHook.shared.updateModel.bind(to: store).disposed(by: disposeBag) | |
} | |
} | |
struct Worker { | |
func loadModel() -> Observable<Model> { .... } | |
} | |
struct Converter { | |
func viewState(_ model: Model) -> ViewState { ... } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment