rac 事件概述及處理

概述:
想要知道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)
  1. 場(chǎng)景: 在項(xiàng)目中穆律, 我們好多地方都需要好多條件同時(shí)成立的時(shí)候才做某些事情,combineLatest 信號(hào)就是為了解決多條件成立才執(zhí)行而產(chǎn)生的导俘。
  2. 使用:
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)方法
  1. 場(chǎng)景: 我們有時(shí)候?qū)?有些 自定義的view點(diǎn)擊需要收回鍵盤少梁,例如: UICollectionView 點(diǎn)擊的時(shí)候洛口, 沒(méi)辦法直接獲取 UICollectionViewtouchesBegan 方法進(jìn)行重寫, 這種情況下我們就需要使用到signal對(duì)象對(duì)view的 touchesBegan 進(jìn)行監(jiān)聽(tīng)
  2. 使用:
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)方法
  1. 場(chǎng)景: 針對(duì) webviewcanGoBack 屬性進(jìn)行監(jiān)聽(tīng), 使用此函數(shù)凯沪, 能夠?qū)λ械膶?duì)象屬性進(jìn)行監(jiān)聽(tīng)操作第焰。所監(jiān)聽(tīng)到的值 valueAny? 類型。
  2. 使用:
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)留言指教瞻佛,謝謝!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娇钱,一起剝皮案震驚了整個(gè)濱河市伤柄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌文搂,老刑警劉巖适刀,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煤蹭,居然都是意外死亡笔喉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門硝皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)常挚,“玉大人,你說(shuō)我怎么就攤上這事稽物⊙僬保” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵贝或,是天一觀的道長(zhǎng)吼过。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咪奖,這世上最難降的妖魔是什么盗忱? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赡艰,結(jié)果婚禮上售淡,老公的妹妹穿的比我還像新娘。我一直安慰自己慷垮,他們只是感情好揖闸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著料身,像睡著了一般汤纸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芹血,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天贮泞,我揣著相機(jī)與錄音楞慈,去河邊找鬼。 笑死啃擦,一個(gè)胖子當(dāng)著我的面吹牛囊蓝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播令蛉,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼聚霜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了珠叔?” 一聲冷哼從身側(cè)響起蝎宇,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祷安,沒(méi)想到半個(gè)月后姥芥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汇鞭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年凉唐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霍骄。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熊榛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腕巡,到底是詐尸還是另有隱情玄坦,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布绘沉,位于F島的核電站煎楣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏车伞。R本人自食惡果不足惜择懂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望另玖。 院中可真熱鬧困曙,春花似錦、人聲如沸谦去。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳄哭。三九已至要糊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妆丘,已是汗流浹背锄俄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工局劲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奶赠。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓鱼填,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毅戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剔氏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348