Skip to content

Instantly share code, notes, and snippets.

@kakajika
Last active September 23, 2018 09:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kakajika/1cb14658237808a570bd01c6cd60150e to your computer and use it in GitHub Desktop.
Save kakajika/1cb14658237808a570bd01c6cd60150e to your computer and use it in GitHub Desktop.
import RxSwift
import RxCocoa
final class CreateListViewModel {
/// 中間Stream for Input
//PublishSubject:外からの入力のみを受け付ける
private let createBtnDidTapStream = PublishSubject<Void>()
private let genreStream = BehaviorSubject<String>(value: "")
private let toDoStream = BehaviorSubject<String>(value: "")
/// 中間Stream for Output
private let navigateToMainStream: Observable<Void>
private let toDoListStream: Observable<[[String: Any]]>
init() {
// ボタンがタップされるたびにtodoを追加したリストを流すストリームの例
self.toDoListStream = self.createBtnDidTapStream
.withLatestFrom(Observable.combineLatest(
self.toDoStream.asObservable(),
self.genreStream.asObservable()
)) { _, todoAndGenre -> [String: Any] in
let (todo, genre) = todoAndGenre
return [ "toDo": todo, "genre": genre, "hasDone": false ]
}
.scan([]) { todoList, dict in
return todoList + [dict]
}
.share(replay: 1, scope: .whileConnected) // ストリーム分岐のためにshare
// todoを追加したあとにmain画面へ遷移するイベントを流すストリームの例
self.navigateToMainStream = self.toDoListStream.map { _ in () }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment