# RxSwift Reactive Programming with Swift **Repository Path**: Sven001/RxSwift-Reactive-Programming-with-Swift ## Basic Information - **Project Name**: RxSwift Reactive Programming with Swift - **Description**: RxSwift Reactive Programming with Swift 书籍及源码 - **Primary Language**: Swift - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-01-06 - **Last Updated**: 2023-04-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README RxSwift Reactive Programming with Swift 书籍及源码 ### 环境 Swift 4.2 Xcode 10.1 RxSwift 4.4 ## ViewModel建议规范 mvvm架构示意图 ![View-ViewModel-Model架构](https://images.gitee.com/uploads/images/2020/0106/165109_9f95eced_2164933.png "屏幕快照 2020-01-06 下午4.50.05.png") View Model设计原则 ![ViewModel建立](https://images.gitee.com/uploads/images/2020/0106/165330_f9f4081e_2164933.png "屏幕快照 2020-01-06 下午4.52.38.png") ViewModel只是屏幕界面的数据映射和逻辑大脑,但是不应该把网络请求,导航,缓存等统一放在里面。 ViewModel应该包括, 1. init(输入输出绑定) 2. input 属性 3. output 属性 示例: ```swift class ListPeopleViewModel { private let bag = DisposeBag() let list: ListIdentifier let apiType: TwitterAPIProtocol.Type // MARK: - Input let account: Driver // MARK: - Output let people = BehaviorRelay<[User]?>(value: nil) // MARK: - Init init(account: Driver, list: ListIdentifier, apiType: TwitterAPIProtocol.Type = TwitterAPI.self) { self.account = account self.list = list self.apiType = apiType bindOutput() } func bindOutput() { //observe the current account status let currentAccount = account .filter { account in switch account { case .authorized: return true default: return false } } .map { account -> AccessToken in switch account { case .authorized(let acaccount): return acaccount default: fatalError() } } .distinctUntilChanged() //fetch list members currentAccount.asObservable() .flatMapLatest(apiType.members(of: list)) .map { users in return (try? unbox(dictionaries: users, allowInvalidElements: true) as [User]) ?? [] } .bind(to: people) .disposed(by: bag) } } ```