Combine 简介
Combine framework 是iOS13中新出的一个框架,一种声明式的语法用来处理各种事件流,优点是易于维护和可读性强,和当前流行的RxSwift、RA响应式编程类似,苹果最终还是自己实现了,它也有两个主要的协议:
- Publisher作为产生event的事件源
- Subscriber作为的event的接收者
探究Combine在UITextField的应用
监听UITextField文本的变化,起初写法如下:
viewDidLoad() {
textTF.publisher(for: \.text).sink { (text) in
print(text)
}
}
本以为运行时键盘弹出输入文本,控制台上会打印出来,可结果却没有日志输出,猜测是viewDidLoad执行完毕,里面的代码就释放导致,于是添加一个全局变量cancellable,运行后输入文本发现还是不起作用,代码如下:
var cancellable: AnyCancellable?
override viewDidLoad() {
super.viewDidLoad()
cancellable = textTF.publisher(for: \.text).sink { (text) in
print(text)
}
}
UITextField的text属性是遵守KVO的,按理当键盘输入文本变化的时候,会触发打印日志,于是又猜想键盘输入并没有触发KVO导致的 改变方法后,采用给TextField 添加target-action方式,找了半天Apple没有提供关于UIControl.Event的交互事件的Publisher,参考了github的思路,终于正常运行了,代码如下:
var cancellable: AnyCancellable?
override func viewDidLoad() {
super.viewDidLoad()
cancellable = textTF.publisherEvent(.editingChanged).map(\.text).sink { (text) in
print(text)
}
}
总结
Combine还有待完善,对于常用的UI控件提供的api不够丰富, 还需要自己封装,还需要提供个全局变量引用返回的结果,不太优雅,同时也得出了一个结论:添加监听Control.editingChanged事件会触发UITextField的KVO