探究ios13中Combine在UIKit的用法 一

2,501 阅读1分钟

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