一.UITextField輸入文本監(jiān)聽
1.UITextField文本框輸入內(nèi)容進行監(jiān)聽。
textField.reactive.continuousTextValues.observeValues { (text)in
? ? ?print(text ??"")?
?}
2.UITextField的文本內(nèi)容的長度溯捆,使用map函數(shù)進行信號內(nèi)容的修改,然后再對map后的信號進行觀察.map函數(shù)可以對信號的內(nèi)容進行轉(zhuǎn)換,他的返回值可以是任何你想要的類型.
textField.reactive.continuousTextValues.map { (text) -> Int in
return text!.characters.count
}.observeValues { (count) in
print(count)
}
3.也許你只是在某個條件下勾缭,才想監(jiān)聽UITextfield文本的內(nèi)容。比如:當文本的內(nèi)容長度大于3的時候目养,你才想監(jiān)聽文本的內(nèi)容俩由。這時可以使用filter函數(shù)進行過濾操作。filter函數(shù)只能返回Bool類型癌蚁。只有當filter函數(shù)返回true的時候幻梯,信號繼續(xù)傳遞,我們才能監(jiān)聽到文本的內(nèi)容努释;當filter函數(shù)返回False的時候碘梢,信號會被攔截。
textField.reactive.continuousTextValues.filter { (text) -> Bool in
return text!.characters.count > 3
}.observeValues { (text) in
print(text ?? "")
} ?
二.UIButton點擊事件監(jiān)聽
btn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
print("btn click")
}
三.Combine Siganl (組合信號)
最經(jīng)典的案例:登錄界面的實現(xiàn) 一個賬號文本框 一個密碼文本框 當兩個文本框內(nèi)容的長度都大于3的時候 ,login按鈕才可點擊伐蒂。
//首先創(chuàng)建賬號文本框的signal 煞躬,然后使用map函數(shù)對信號內(nèi)容進行轉(zhuǎn)換。結(jié)果轉(zhuǎn)換為Bool類型
let accountSignal = accountTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
//密碼文本框同理
let pwdSignal = pwdTextField.reactive.continuousTextValues.map { (text) -> Bool in
return text!.characters.count > 3
}
//使用combineLatest函數(shù)將兩個信號組合為一個信號饿自,然后利用map函數(shù)對信號進行轉(zhuǎn)換汰翠。使用<~將信號的結(jié)果綁定到
loginBtn.loginBtn.reactive.isEnabled <~ accountSignal.combineLatest(with: pwdSignal).map({ $0 && $1 }) ?
//如果你對$不熟悉,可以這樣寫
loginBtn.reactive.isEnabled <~ accountSignal.combineLatest(with: pwdSignal).map({ (accountValid, pwdValid) -> Bool in return accountValid && pwdValid })?
四.KVO VS MutableProperty
如果你想對某個屬性的value進行observe.那么你可以使用KVO 昭雌,當然Reactivecocoa里的MutableProperty也可以滿足你的需求,而且它比KVO用起來更加方便复唤。
//<>里面可以是任意類型,它代表屬性的類型烛卧。
let racValue = MutableProperty<Int>(1)
racValue.producer.startWithValues { (make) in
print(make)
}
racValue.value = 10 ?
五.方法調(diào)用攔截
當你想獲取到某個方法被調(diào)用的事件佛纫,比如UIViewController的ViewwillAppear事件。
self.reactive.trigger(for:#selector(UIViewController.viewWillAppear(_:))).observeValues { () in
print("viewWillAppear被調(diào)用了")
}
六.監(jiān)聽對象的生命周期
比如你想在某個對象被銷毀以后总放,做一些事情呈宇。那么你可以對這個對象的生命周期進行監(jiān)聽,也就是當對象銷毀的時候局雄,你獲得對象銷毀的信號,然后觀察這個信號甥啄。當然你也可以重寫deinit函數(shù),當對象被銷毀的時候炬搭,會調(diào)用deinit函數(shù)蜈漓。也就是Objective-C中的dealloc方法。
//按鈕點擊 push到secondVC loginBtn.reactive.controlEvents(.touchUpInside).observeValues { (btn) in
let secondVC = SecondViewController()
//當在secondVC pop的時候宫盔,secondVC會被銷毀 secondVC.reactive.lifetime.ended.observeCompleted {
print("secondVC 被銷毀")
}
self.navigationController?.pushViewController(secondVC, animated: true)
} ?
再看下面的例子:
開始的時候給person屬性賦值一個內(nèi)存地址為0x60800005cfe0對象融虽,
然后對該對象的生命周期進行監(jiān)聽。然后給person屬性重新賦值一個內(nèi)存地址為0x6000002400c0對象灼芭。因為person指針指向了內(nèi)存為0x6000002400c0的對象有额,所以這個時候內(nèi)存為0x60800005cfe0的引用計數(shù)為0,所以0x60800005cfe0的對象會被銷毀,而我們正好對內(nèi)存為0x60800005cfe0對象的生命周期進行了監(jiān)聽,所以會獲取“person對象被銷毀了”事件巍佑。
七.創(chuàng)建自定義的信號
private func createSignInSignal() -> Signal<Bool, NoError> {
let (signInSignal, observer) = Signal<Bool, NoError>.pipe() self.signInService.signIn(withUsername: self.usernameTextField.text!, andPassword: self.passwordTextField.text!) { success in
observer.send(value: success)
observer.sendCompleted()
}
return signInSignal
} ?