iOS MVVM 与 RxSwift

编程入门 行业动态 更新时间:2024-10-27 09:44:36

<a href=https://www.elefans.com/category/jswz/34/1770014.html style=iOS MVVM 与 RxSwift"/>

iOS MVVM 与 RxSwift

MVVM

Model:数据模型
View:UI展示
ViewModel:逻辑处理

架构解决问题:

  • viewcontroller太重,ui布局与逻辑处理没有很好的区分开来。所以一个viewcontroller的文件,很容易就写到几千行。
  • 将逻辑处理内容区分开来,专门放到一个类里去处理,就出现了viewmodel,连接view 和 model。

model:

class UserModel: NSObject {var userName:String = ""var password:String = ""
}

viewModel:

var userModel:PublishSubject<UserModel?>override init() {userModel = PublishSubject()
}func loginAction(userName:String, password:String)

view:

var userViewModel = UserViewModel()@IBOutlet weak var userNameTextField: UITextField!@IBOutlet weak var passwordTextField: UITextField!@IBOutlet weak var loginButton: UIButton!

整体项目功能:
1、登录页面 (view)
2、调用登录 (viewmodel)
3、返回数据 (model)
4、数据赋值(viewmodel)
5、页面变化(view)


RxSwift

响应式编程,简化层级架构之间的通信,不用依靠delegate、notification,代码结构更加清晰。

察值:
view:观察viewModel中的userModel是否发生变化。如果发生变化,根据userModel的内容,判定是否登录成功

self.userViewModel.userModel.subscribeNext({ UserModel inif (UserModel == nil) {print("登录失败")}else {print("登录成功")}
}).addDisposableTo(disposeBag)

viewmodel:注意持有的model的类型(见最上viewmodel内容图)

PublishSubject:只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。

BehaviorSubject:当观察者订阅 BehaviorSubject 时,它开始发射原始 Observable 最近发射的数据(如果此时还没有收到任何数据,它会发射一个默认值),然后继续发射其它任何来自原始Observable的数据。

Variable:封装了 BehaviorSubject 。使用 variable 的好处是 variable 将不会显式的发送 Error 或者 Completed 。在 deallocated 的时候, Variable 会自动的发送 complete 事件。

ReplaySubject:会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。当一个新的 observer 订阅了一个 ReplaySubject 之后,他将会收到当前缓存在 buffer 中的数据和这之后产生的新数据

改值

判断输入框的输入长度是否达到指定长度

let userNameValid = userNameTextField.rx_text.map{$0.characters.count >= minimalUsernameLength}.shareReplay(1)
let passwordValid = passwordTextField.rx_text.map{$0.characters.count >= minimalPasswordLength}.shareReplay(1)

将姓名和密码的输入框,文字类型的信号,根据长度,转换成了波尔类型的信号

map:通过对Observable发射映射的函数对每一项做转换

flatMap:将每个 Obserable 发射的数据变换为 Observable 的集合,然后将其 “拍扁”(降维 flatten)成一个 Observable。

scan:scan连续的对序列中的元素应用某一个元素。然后把结果作为下一次的输入

合并
当两个输入框输入长度都达标时,登录按钮才可以点击

let everythingValid = ObservablebineLatest(userNameValid, passwordValid) { $0 && $1 }.shareReplay(1)everythingValid.bindTo(loginButton.rx_enabled).addDisposableTo(disposeBag)everythingValid.subscribeNext { [weak self] Bool inif (Bool) {self?.loginButton.backgroundColor = UIColor.redColor()}else {self?.loginButton.backgroundColor = UIColor.lightGrayColor()}
}.addDisposableTo(disposeBag)

合并了两个信号量,绑定给了button的enalbed属性,并且根据不同的enable信号,button的背景色不同。

combineLatest:当两个Observables中任意一个发送了数据,使用一个函数把两个Observable中最近的数据进行结合

startWith:在数据序列的开头增加一些数据

zip:它会等到Observable中的数据一一对应结合时,再发送数据

merge:合并多个 Observables 的组合成一个

switchLatest:将一个发射多个 Observables 的 Observable 转换成另一个单独的 Observable,后者发射那些 Observables 最近发射的数据项

demo地址:

更多推荐

iOS MVVM 与 RxSwift

本文发布于:2024-02-16 23:46:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1691852.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:iOS   MVVM   RxSwift

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!