Skip to content

Instantly share code, notes, and snippets.

@RyogaK
Created April 25, 2017 17:57
Show Gist options
  • Save RyogaK/16b205563b13dc77abb456b3cd6ef0e5 to your computer and use it in GitHub Desktop.
Save RyogaK/16b205563b13dc77abb456b3cd6ef0e5 to your computer and use it in GitHub Desktop.
Rx+MVVM Sample
import RxSwift
protocol ModelInputs {
func doSomething(strs: [String])
}
protocol ModelOutputs {
var outputInts: Observable<[Int]> { get }
}
protocol ModelType {
var inputs: ModelInputs { get }
var outputs: ModelOutputs { get }
}
class Model: ModelType, ModelInputs, ModelOutputs {
var inputs: ModelInputs { return self }
var outputs: ModelOutputs { return self }
let doSomethingProperty = PublishSubject<[String]>()
let outputInts: Observable<[Int]>
init() {
outputInt = doSomethingProperty.flatMap(someProcess)
}
}
extension ViewModel: ViewModelInputs {
func doSomething(strs: [String]) { doSomethingProperty.onNext(strs) }
}
private func someProcess(strs: [String]) -> Observable<Int> {
return strs.flatMap(Int.init(string:)).filter { $0 % 2 == 0 }
}
import RxSwift
protocol ViewModelInputs {
func someInput1(strs: [String])
func someInput2(strs: [String])
}
protocol ViewModelOutputs {
var someOutput: Observable<[Int]> { get }
}
protocol ViewModelType {
var inputs: ViewModelInputs { get }
var outputs: ViewModelOutputs { get }
}
class ViewModel: ViewModelType, ViewModelInputs, ViewModelOutputs {
var inputs: ViewModelInputs { return self }
var outputs: ViewModelOutputs { return self }
let someInput1Property = PublishSubject<[String]>()
let someInput2Property = PublishSubject<[String]>()
let someOutput: Observable<[Int]>
let disposeBag = DisposeBag()
init(someModel1: ModelType, someModel2: ModelType) {
someInput1.bindNext(someModel1.doSomething).addDisposableTo(disposeBag)
someInput2.bindNext(someModel2.doSomething).addDisposableTo(disposeBag)
someOutput = Observable.combineLatest(someModel1.outputInts, someModel2.outputInts) { $0 + $1 }
}
}
extension ViewModel: ViewModelInputs {
func someInput1(strs: [String]) { someInput1Property.onNext(strs) }
func someInput2(strs: [String]) { someInput2Property.onNext(strs) }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment