RxSwift教程 1 - 理解Observable & Observer

聲明: 部分資料摘自 http://www.reibang.com/p/431f645cb805http://www.codertian.com/2016/12/01/RxSwift-ru-keng-ji-learn-the-difficulty

ObserverType: Supports push-style iteration over an observable sequence. ObserverType是觀察者Observer需要遵從的協(xié)議

/// Supports push-style iteration over an observable sequence.
public protocol ObserverType {
    /// The type of elements in sequence that observer can observe.
    associatedtype E

    /// Notify observer about sequence event.
    ///
    /// - parameter event: Event that occured.
    func on(_ event: Event<E>)
}

ObservableType: Represents a push style sequence。ObservableType是Observable需要遵從的協(xié)議。

/// Represents a push style sequence.
public protocol ObservableType : ObservableConvertibleType {
    /// Type of elements in sequence.
    associatedtype E
    
    func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E
   ...
}

Observable是一種像信號(hào)一樣的序列簇爆,而信號(hào)就需要有人監(jiān)聽(tīng)這些信號(hào)。ObservableType協(xié)議中定義的subscribe函數(shù)就是一種簡(jiǎn)便的訂閱信號(hào)的一種方法峦嗤。這里的subscribe函數(shù)就是把消息發(fā)給觀察者

extension ObservableType {

    /**
    Creates new subscription and sends elements to observer.
    
    In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables
    writing more consistent binding code.
    
    - parameter observer: Observer that receives events.
    - returns: Disposable object that can be used to unsubscribe the observer.
    */
    public func bindTo<O: ObserverType where O.E == E>(_ observer: O) -> Disposable
    
    /**
        Creates new subscription and sends elements to variable.
    
        In case error occurs in debug mode, `fatalError` will be raised.
        In case error occurs in release mode, `error` will be logged.
    
        - parameter variable: Target variable for sequence elements.
        - returns: Disposable object that can be used to unsubscribe the observer.
        */
    public func bindTo(_ variable: RxSwift.Variable<Self.E>) -> Disposable

    ...

bindTo是ObservableType協(xié)議的擴(kuò)展方法屋摔,bindTo等同于subscribe烁设,但依RxCocoa中所說(shuō)的,bindTo的內(nèi)在實(shí)現(xiàn)更好钓试,并且bindTo這個(gè)名稱(chēng)也很直觀装黑,所以當(dāng)引入了RxCocoa這個(gè)framework后一般我都是用bindTo來(lái)實(shí)現(xiàn)UI的訂閱副瀑。

  • bindTo其中一個(gè)用的比較多的重載方法bindTo<O: ObserverType where O.E == E>(_ observer: O) -> Disposable,這個(gè)方法有一個(gè)參數(shù)恋谭,從方法泛型的聲明中可以得知糠睡,參數(shù)的類(lèi)型為一個(gè)觀察者類(lèi)型,且這個(gè)觀察者能夠接受到的事件流元素的類(lèi)型要跟被觀察者的一樣(O.E == E)疚颊。這個(gè)方法意圖就是將一個(gè)被觀察者與一個(gè)指定的觀察者進(jìn)行綁定狈孔,被觀察者事件流中發(fā)出的所有事件元素都會(huì)讓觀察者接收。
    在MVVM架構(gòu)模式中材义,此方法主要用于視圖(View)層跟視圖模型(ViewModel)層或視圖層跟視圖層的綁定均抽,例如:
    <pre>
    textField.rx.text
    .bindTo(label.rx.text)
    .disposed(by: disposeBag)
    </pre>
  • UITextField的rx.text的屬性類(lèi)型是ControlProperty,不僅是觀察者類(lèi)型母截,還是被觀察者類(lèi)型:
struct ControlProperty<PropertyType> : ControlPropertyType
...
protocol ControlPropertyType: ObservableType, ObserverType
> * UILabel中的`rx.text`的屬性類(lèi)型是**`UIBindingObserver`**, 只是單純的觀察者類(lèi)型到忽。
> 
```swift
class UIBindingObserver<UIElementType, Value> : ObserverType where UIElementType: AnyObject {
    public typealias E = Value
    weak var UIElement: UIElementType?
>    
    /// Initializes `ViewBindingObserver` using
    public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) 
   ...
}
  • UIBindingObserver是一個(gè)類(lèi)橄教,他的初始化方法中清寇,有兩個(gè)參數(shù),第一個(gè)參數(shù)是要被綁定的視圖的實(shí)例护蝶,第二個(gè)參數(shù)是一個(gè)閉包华烟,閉包參數(shù)是被綁定了的視圖本身,和一個(gè)由綁定的被觀察者中所發(fā)射出來(lái)的事件元素持灰。
    在RxCocoa框架中盔夜,UILable中的text屬性是這樣實(shí)現(xiàn)的:
public struct Reactive<Base> {
     /// Base object to extend.
    public let base: Base
    ...
}
>
extension Reactive where Base: UILabel {
>
    /// Bindable sink for `text` property.
    public var text: UIBindingObserver<Base, String?> {
        return UIBindingObserver(UIElement: self.base) { label, text in
            label.text = text
        }
    }
   ...
  • UIBindingObserver這個(gè)東西很有用的,可以用來(lái)創(chuàng)建我們自己的監(jiān)聽(tīng)者堤魁。因?yàn)橛袝r(shí)候RxCocoa給的擴(kuò)展不夠我們使用喂链,比如一個(gè)UITextField有個(gè)isEnabled屬性,我想把這個(gè)isEnabled變?yōu)橐粋€(gè)observer妥泉,我們可以這樣做:
extension Reactive where Base: UITextField {
    var inputEnabled: UIBindingObserver<Base, Bool> {
        return UIBindingObserver(UIElement: self.base) { textField, enabled in
            textField.isEnabled = enabled
        }
    }
}
// 當(dāng)textField1輸入的字符長(zhǎng)度大于3時(shí)椭微, textField2的輸入框變成激活的。
textField1.rx.text
    .orEmpty    //Transforms ControlProperty of type `String?` into ControlProperty of type `String`.
    .map{ $0.characters.count > 3 }
    .bindTo(textField2.rx.inputEnabled)
    .disposed(by: disposeBag)
  • bindTo的另外一個(gè)用得比較多的重載方法是:bindTo(_ variable: RxSwift.Variable<Self.E>) -> Disposable盲链,這個(gè)方法將一個(gè)被觀察者與一個(gè)Variable(變量)綁定在一起蝇率,這個(gè)變量的元素類(lèi)型跟被觀察者的事件元素類(lèi)型一致。此方法作用就是把從被觀察者事件流中發(fā)射出的事件元素存入變量中刽沾。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本慕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侧漓,更是在濱河造成了極大的恐慌锅尘,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件布蔗,死亡現(xiàn)場(chǎng)離奇詭異藤违,居然都是意外死亡忙菠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)纺弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牛欢,“玉大人,你說(shuō)我怎么就攤上這事淆游“茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵犹菱,是天一觀的道長(zhǎng)拾稳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腊脱,這世上最難降的妖魔是什么访得? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮陕凹,結(jié)果婚禮上悍抑,老公的妹妹穿的比我還像新娘。我一直安慰自己杜耙,他們只是感情好搜骡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著佑女,像睡著了一般记靡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上团驱,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天摸吠,我揣著相機(jī)與錄音,去河邊找鬼嚎花。 笑死寸痢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贩幻。 我是一名探鬼主播轿腺,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丛楚!你這毒婦竟也來(lái)了族壳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趣些,失蹤者是張志新(化名)和其女友劉穎仿荆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢操,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锦亦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片令境。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杠园,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舔庶,到底是詐尸還是另有隱情抛蚁,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布惕橙,位于F島的核電站瞧甩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥鹦。R本人自食惡果不足惜肚逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彬坏。 院中可真熱鬧朦促,春花似錦、人聲如沸苍鲜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)混滔。三九已至,卻和暖如春歹颓,著一層夾襖步出監(jiān)牢的瞬間坯屿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工巍扛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领跛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓撤奸,卻偏偏與公主長(zhǎng)得像吠昭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胧瓜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理矢棚,服務(wù)發(fā)現(xiàn),斷路器府喳,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 本章將向你介紹另一個(gè)框架蒲肋,它是原生RxSwift庫(kù)的一部分:RxCocoa。 RxCocoa全平臺(tái)通用。每個(gè)平臺(tái)有...
    大灰很閱讀 861評(píng)論 3 2
  • 前言 在之前用Objective-C語(yǔ)言做項(xiàng)目的時(shí)候兜粘,我習(xí)慣性的會(huì)利用MVVM模式去架構(gòu)項(xiàng)目申窘,在框架Reactiv...
    Tangentw閱讀 21,175評(píng)論 32 123
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評(píng)論 25 707
  • 陌生人的愛(ài),來(lái)得不那么理所當(dāng)然孔轴,才顯得那么滴水難得剃法,周末閑余,寫(xiě)寫(xiě)我人生中的第一位貴人路鹰。 我已經(jīng)不記得娟姨是什么時(shí)...
    阿拉半仙閱讀 502評(píng)論 4 2