前言:几年前空闲时间玩了Vue.js, 发现利用数据双向绑定,开发如此轻松简洁,我了解iOS也有类似的框架 ReactiveCocoa, ReactiveCocoa有点复杂和笨重,我只需要简单点的数据绑定,所以写了一个轻量级的数据绑定,麻烦大家看一下,有问题请指点下
1.Demo例子:
一般配合MVVM架构使用,主要用于View和ViewModel双向绑定,也可用于其他数据双向绑定
这里介绍下双向数据绑定好处:
View.textField 跟 ViewModel.text 绑定,用户在输入框textField输入"Hello World",text也会响应式更新,此时text = @"Hello World", 我们只要对text进行处理
如果我们从网络获取Model,Model 转换并赋值于 ViewModel.text,View也会响应式更新界面, 整个过程都是对ViewModel.text进行操作,不会再去处理View部分
github地址: https://github.com/shidavid/DVDataBind
其他例子:利用 DVDataBind 双向绑定 + MVVM 简单实现登录界面
2.介绍:
不限定只能 View 与 ViewModel 绑定,只要支持KVC的数据都能双向绑定
使用链式编程,支持多项绑定
支持单向数据流/双向数据流
支持 字符串,整形,浮点型,布尔类型 之间数据自动转换 (对象类型除外)
支持过滤, 限制,转换, 观察数组某一位数据变化
无需继承基类,无需手动解绑, 当目标对象内存释放,DataBind自动解绑和释放内存
3.思路
A 与 B 双向数据绑定,Ain数据变化更新Aout、Bout数据,Bin同理
有时候 A 与 B 双向绑定,B 与 C 双向绑定, 其实相当于 A、B、C 一起绑定在一条数据链Chain上, 每当有一个in数据变化, 发送新数据到Chain上,再由Chain更新所有的out数据
这样实现单向/双向数据流
利用KVO, 数据链就相当于Obverse,每个Observer用一个ChainCode标记,Observer观察每个in数据变化,并更新到所有Out数据
4.用法
DVDataBind 必须用 _in 或 _inout 开头, 后面绑定顺序先后随意, 任意组合, 不影响结果
_in 只发送新数据,_inout 可接受和发送新数据,_out 只接受新数据
目标对象必须支持KVC
目标对象不能为nil, property可为nil
Swift也能使用, 只不过更新数据不能直接 object.property = xxx , 需要 object.setValue(xxx, forKey: "property")
1. 普通绑定
2. UI 绑定
3.转换
支持 字符串,整形,浮点型,布尔类型 之间数据自动转换 (对象类型除外)
4.数组
5.取反
6.输出Block
支持绑定多个输出Block, 更新数据不支持自动转换
7.过滤,限制
一个数据链只能绑定一个过滤, 更新数据不支持自动转换
在这里可以对数据进行判断,限制,校验等等操作
8.中途增加绑定
9.解绑
已经支持 当对象内存释放自动解绑, 无需手动解绑, 如果想手动解绑可用以下API
5.如何导入项目
编译DVDataBindKitShell
生成Framework拖入项目
项目 Target -> Build Settings -> Linking ->Other Linker Flags 添加参数: -all_load -ObjC
在PCH文件导入
6.结语:
github地址: https://github.com/shidavid/DVDataBind
谢谢大家观看,有兴趣麻烦点个星星关注下
领取专属 10元无门槛券
私享最新 技术干货