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 😁)
Features
- MVVM design pattern
- Using RxDataSources
- Observing model create/update/delete across the view controllers
- Navigating between view controllers
- Immutable models and view models
Philisophy
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.loginButton) // "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
class ProductViewModel { let product: Driver // Bad: ViewModel should hide Model }Good
class ProductViewModel { let productName: Driver let formattedPrice: Driver let formattedOriginalPrice: Driver let originalPriceHidden: Driver }
Requirements
- iOS 8+
- Swift 2.2
- CocoaPods (I used 1.0.0)
Screenshots
Contribution
Discussion and pull requests are welcomed 💖
License
RxTodo is under MIT license. See the LICENSE for more info.
