这一节讲几个常用的方法。
combineLatest就是将多个observable打包转换成我们需要的信号。
但这样有时候这种信号仍不是我们想要的,这时我们可以用map来转换一下。
zip和combineLatest有点像。区别在于combineLatest是多个信号中任何一个改变都会打包发送一次,而zip则是所有信号都发生改变之后打包发送。
举个例子,两个输入框和一个按钮,模拟用户名和密码输入。当两个的长度都大于6的时候才是有效的,并将结果绑定在按扭上。用combineLatest则是两个输入框有任何改变都会发送信号给按扭。而zip则是第一个改变了,第二个也要改变才会发送。
let textField1 = UITextField(frame: CGRect(x: 10, y: 10, width: 100, height: 30))
textField1.borderStyle = .RoundedRect
view.addSubview(textField1)
let textField2 = UITextField(frame: CGRect(x: 10, y: 50, width: 100, height: 30))
textField2.borderStyle = .RoundedRect
view.addSubview(textField2)
let button = UIButton(type: .Custom)
button.frame = CGRect(x: 10, y: 90, width: 100, height: 30)
button.setTitleColor(.blackColor(), forState: .Normal)
button.setTitleColor(.redColor(), forState: .Disabled)
view.addSubview(button)
button.setTitle("OK", forState: .Normal)
button.setTitle("Disabled", forState: .Disabled)
Observable
.combineLatest(textField1.rx_text, textField2.rx_text) { ($0, $1) }
.map { $0.characters.count > 6 && $1.characters.count > 6 }
.bindTo(button.rx_enabled)
.addDisposableTo(disposeBag)