RxTodo is an iOS application developed using RxSwift and MVVM design pattern. This project is for whom having trouble with learning RxSwift and MVVM due to lack of references. (as I did ๐)
- MVVM design pattern
- Using RxDataSources
- Observing model create/update/delete across the view controllers
- Navigating between view controllers
- Immutable models and view models
- Testing with RxExpect
-
View doesn't have control flow. View cannot modify the data. View only knows how to map the data.
Bad
viewModel.title .map { $0 + "!" } // Bad: View should not modify the data .bindTo(self.titleLabel)
Good
viewModel.title .bindTo(self.titleLabel)
-
View doesn't know what ViewModel does. View can only communicate to ViewModel about what View did.
Bad
viewModel.login() // Bad: View should not know what ViewModel does (login)
Good
self.loginButton.rx_tap .bindTo(viewModel.loginButtonDidTap) // "Hey I clicked the login button" self.usernameInput.rx_controlEvent(.EditingDidEndOnExit) .bindTo(viewModel.usernameInputDidReturn) // "Hey I tapped the return on username input"
-
Model is hidden by ViewModel. ViewModel only exposes the minimum data so that View can render.
Bad
struct ProductViewModel { let product: Driver<Product> // Bad: ViewModel should hide Model }
Good
struct ProductViewModel { let productName: Driver<String> let formattedPrice: Driver<String> let formattedOriginalPrice: Driver<String> let originalPriceHidden: Driver<Bool> }
- iOS 8+
- Swift 2.2
- CocoaPods (I used 1.0.0)
Discussion and pull requests are welcomed ๐ Correcting English grammar is welcomed, too.
RxTodo is under MIT license. See the LICENSE for more info.