Skip to content

Instantly share code, notes, and snippets.

@GeekTree0101
Last active July 12, 2019 02:40
Show Gist options
  • Save GeekTree0101/80382610523512ac9e946d1edb2ed75b to your computer and use it in GitHub Desktop.
Save GeekTree0101/80382610523512ac9e946d1edb2ed75b to your computer and use it in GitHub Desktop.
Marty MVVM
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