概述:
想要知道rac就必須知道rac中的三個(gè)要點(diǎn) 創(chuàng)建信號(hào)、發(fā)送信號(hào)胸竞、訂閱信號(hào)明场。
- reactive事件
reactive事件就是將控件變信號(hào)可響應(yīng)的, continuousTextValues: 是textField的text值的信號(hào)灰羽, 通過(guò)observeValues,我們可以觀察到continuousTextValues這個(gè)信號(hào)傳來(lái)的Value事件改橘,每次在usernameTextField輸入的時(shí)候滋尉,我們就會(huì)接收到text的值。
/** textField 輸入事件 */
tf_userName.reactive.continuousTextValues.observeValues {
text in
print(text ?? "")
}
- map函數(shù)
注意到我們新添加的map函數(shù)飞主,給map函數(shù)提供一個(gè)closure狮惜,它就能夠轉(zhuǎn)換事件的數(shù)據(jù)。
對(duì)于每一次map接收到的Value事件碌识,它就會(huì)運(yùn)行closure碾篡,以closure的返回值作為Value事件發(fā)送出去。
面的代碼中筏餐,我們的text的值映射成text的字符數(shù)开泽。
fileprivate func set_map() {
txtUser Name.reactive.continuousTextValues.map({ text in
return text?.characters.count
}).filter { (characterCount) -> Bool in
return characterCount! > 3
}.observeValues { (characterCount) in
log.debug(characterCount ?? "")
}
}
- observeValues 使用
關(guān)于Observer上面我已經(jīng)提過(guò)了, 有些observer我沒(méi)有使用到魁瞪, 大家可以繼續(xù)摸索
fileprivate func set_observeValues() {
txtUserName.reactive.continuousTextValues.observeValues { (text) in
log.debug(text ?? "")
}
txtPassword.reactive.continuousTextValues.observeValues { (text) in
log.debug(text ?? "")
}
}
- combineLatest聯(lián)合信號(hào)
- 場(chǎng)景: 在項(xiàng)目中穆律, 我們好多地方都需要好多條件同時(shí)成立的時(shí)候才做某些事情,
combineLatest
信號(hào)就是為了解決多條件成立才執(zhí)行而產(chǎn)生的导俘。- 使用:
Signal.combineLatest(self.rac_mobileIsValid.signal, self.rac_codeIsValid.signal, self.rac_hasAgreed.signal).observeValues { [unowned self] (value) in
let isValid = value.0 && value.1 && value.2
self.btn_binding.backgroundColor = isValid ? projectTintColor : .lightGray
self.btn_binding.isEnabled = isValid
}
- filter 使用
fileprivate func set_filter() {
/** filter 這個(gè)函數(shù)只有返回true的時(shí)候才會(huì)調(diào)用 可以根據(jù)返回值進(jìn)行業(yè)務(wù)邏輯處理 */
txtUserName.reactive.continuousTextValues.filter({
text in
return text!.characters.count > 3 // 如果字符大于3的時(shí)候才會(huì)返回true
}).observeValues { // 通過(guò)observeValues峦耘, 我們可以獲取到continuousTextValues這個(gè)信號(hào)傳來(lái)的value事件
text in
print(text ?? "")
}
}
- <~ 符號(hào)
<~操作符的左邊應(yīng)為遵循了BindingTarget的協(xié)議的類型,而右邊是信號(hào)(Signal)的類型旅薄。
第一種方式辅髓,針對(duì)按鈕操作
btn_login.reactive.isEnabled <~ Signal.combineLatest(validUserNameSignal, validPassWordNameSignal).map{ $0 && $1 }
第二種方式,針對(duì)需要處理的業(yè)務(wù)邏輯操作
Signal.combineLatest(rac_operatorReqComplete.signal, rac_priceListReqComplete.signal)
.observeValues { (tuple) in
if tuple.0 == true && tuple.1 == true {
print("")
}
}
- signal(for: )函數(shù) 監(jiān)聽(tīng)系統(tǒng)方法
- 場(chǎng)景: 我們有時(shí)候?qū)?
有些
自定義的view點(diǎn)擊需要收回鍵盤少梁,例如:UICollectionView
點(diǎn)擊的時(shí)候洛口, 沒(méi)辦法直接獲取UICollectionView
的touchesBegan
方法進(jìn)行重寫, 這種情況下我們就需要使用到signal對(duì)象對(duì)view的touchesBegan
進(jìn)行監(jiān)聽(tīng)- 使用:
v_dataBase.cvc_leader.reactive.signal(for: #selector(touchesBegan(_:with:))).observeValues { (_) in
`self`.v_dataBase.v_search.tf_search.resignFirstResponder()
}
- signal(forKeyPath: )函數(shù) 監(jiān)聽(tīng)系統(tǒng)方法
- 場(chǎng)景: 針對(duì)
webview
的canGoBack
屬性進(jìn)行監(jiān)聽(tīng), 使用此函數(shù)凯沪, 能夠?qū)λ械膶?duì)象屬性進(jìn)行監(jiān)聽(tīng)操作第焰。所監(jiān)聽(tīng)到的值value
為Any?
類型。- 使用:
self.webView.reactive.signal(forKeyPath: "canGoBack")
.observeValues { (value) in
guard let canGoBack = value as? Bool else { return }
guard let `self` = weakSelf else { return }
if canGoBack {
print("")
} else {
print("")
}
}
注意: 使用RAC添加到項(xiàng)目中的話妨马, 需要謹(jǐn)慎使用挺举,以免出現(xiàn)釋放不了而產(chǎn)生的泄露問(wèn)題而叼。 今天先出基礎(chǔ), 后期繼續(xù)更新封裝網(wǎng)絡(luò)請(qǐng)求豹悬。
- 本人小白一個(gè), 有不合適之處液荸, 還請(qǐng)留言指教瞻佛,謝謝!