如何正確的創(chuàng)建Observable?

創(chuàng)建 Observable 序列

1. just() 方法

(1)該方法通過傳入一個默認值來初始化。

(2)下面樣例我們顯式地標注出了?observable?的類型為?Observable<Int>,即指定了這個?Observable?所發(fā)出的事件攜帶的數(shù)據(jù)類型必須是?Int?類型的。

let observable = Observable.just(5)

?2. of() 方法

(1)該方法可以接受可變數(shù)量的參數(shù)(必需要是同類型的)

(2)下面樣例中我沒有顯式地聲明出?Observable?的泛型類型,Swift?也會自動推斷類型。

let observable = Observable.of("A","B","C")

3. from() 方法

(1)該方法需要一個數(shù)組參數(shù)。

(2)下面樣例中數(shù)據(jù)里的元素就會被當做這個?Observable?所發(fā)出?event?攜帶的數(shù)據(jù)內(nèi)容,最終效果同上面餓?of()?樣例是一樣的。

let observable = Observable.from(["A","B","C"])

4. empty() 方法

該方法創(chuàng)建一個空內(nèi)容的?Observable?序列。

let observable = Observable.empty()

5. never() 方法

該方法創(chuàng)建一個永遠不會發(fā)出?Event(也不會終止)的?Observable?序列。

let observable = Observable.never()

6. error() 方法

該方法創(chuàng)建一個不做任何操作,而是直接發(fā)送一個錯誤的?Observable?序列。

enum myError: Error {

? case A

? case B

}

let observable = Observable<Int>.error(MyError.A)

7. range() 方法

(1)該方法通過指定起始和結(jié)束數(shù)值,創(chuàng)建一個以這個范圍內(nèi)所有值作為初始值 Observable 序列。

(2)下面樣例中,兩種方法創(chuàng)建的?Observable?序列都是一樣的。

//使用of()

let observable = Observable.of(1, 2, 3, 4, 5)

//使用range()

let observable = Observable.range(start: 1, count: 5)

8. repeatElement() 方法

該方法創(chuàng)建一個可以無限發(fā)出給定元素的?Event?的?Observable?序列(永不終止)。?

let observable = Observable.repeatElement(1)

9. generate() 方法

(1)該方法創(chuàng)建一個只有當提供的所有的判斷條件都為?true?的時候,才會給出動作的 Observable 序列。

(2)下面樣例中,兩種方法創(chuàng)建的?Observable?序列都是一樣的。

//使用of()

let observable = Observable.of(0, 2, 4, 6, 8, 10)

//使用generate()?

let observable = Observable.generate(

initialState: 0,

condition: { $0 <= 10 },

iterate: { $0 + 2 }

)

10. create() 方法

(1)該方法接受一個?block?形式的參數(shù),任務(wù)是對每一個過來的訂閱進行處理。

(2)下面是一個簡單的樣例。

//這個block有一個回調(diào)參數(shù)observer就是訂閱這個Observable對象的訂閱者

//當一個訂閱者訂閱這個Observable對象的時候,就會將訂閱者作為參數(shù)傳入這個block來執(zhí)行一些內(nèi)容

let observable = Observable<String>.create{observer in

? ? //對訂閱者發(fā)出了.next事件,且攜帶了一個數(shù)據(jù)"Observable"

? ? observer.onNext("Observable")

? ? //對訂閱者發(fā)出了.completed事件

? ? observer.onCompleted()

? ? //因為一個訂閱行為會有一個Disposable類型的返回值,

? ? //所以在結(jié)尾一定要returen一個Disposable

? ? return Disposables.create()

}

//訂閱測試

observable.subscribe {

? ? print($0)

}

?11. deferred() 方法

(1)該個方法相當于是創(chuàng)建一個?Observable?工廠,通過傳入一個?block?來執(zhí)行延遲Observable?序列創(chuàng)建的行為,而這個?block?里就是真正的實例化序列對象的地方。

(2)下面是一個簡單的演示樣例:

//用于標記是奇數(shù)、還是偶數(shù)

var isOdd = true

//使用deferred()方法延遲Observable序列的初始化,

//通過傳入的block來實現(xiàn)Observable序列的初始化并且返回。

let factory : Observable<Int> = Observable.deferred {


? ? //讓每次執(zhí)行這個block時候都會讓奇、偶數(shù)進行交替

? ? isOdd = !isOdd

? ? //根據(jù)isOdd參數(shù),決定創(chuàng)建并返回的是奇數(shù)Observable、還是偶數(shù)Observable

? ? if isOdd {

? ? ? ? return Observable.of(1, 3, 5 ,7)

? ? } else {

? ? ? ? return Observable.of(2, 4, 6, 8)

? ? }

}


//第1次訂閱測試

factory.subscribe { event in

? ? print("\(isOdd)", event)

}


//第2次訂閱測試

factory.subscribe { event in

? ? print("\(isOdd)", event)

}

12. interval() 方法

(1)這個方法創(chuàng)建的?Observable?序列每隔一段設(shè)定的時間,會發(fā)出一個索引數(shù)的元素。而且它會一直發(fā)送下去。

(2)下面方法讓其每?1?秒發(fā)送一次,并且是在主線程(MainScheduler)發(fā)送。

let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)


observable.subscribe { event in

? ? print(event)

}

13. timer() 方法

(1)這個方法有兩種用法,一種是創(chuàng)建的?Observable?序列在經(jīng)過設(shè)定的一段時間后,產(chǎn)生唯一的一個元素。

//5秒種后發(fā)出唯一的一個元素0

let observable = Observable<Int>.timer(5, scheduler: MainScheduler.instance)

observable.subscribe { event in

? ? print(event)

}

(2)另一種是創(chuàng)建的?Observable?序列在經(jīng)過設(shè)定的一段時間后,每隔一段時間產(chǎn)生一個元素。

//延時5秒種后,每隔1秒鐘發(fā)出一個元素

let observable = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)

observable.subscribe { event in

? ? print(event)

}

?Subjects 介紹

1. Subjects 基本介紹

(1)Subjects?既是訂閱者,也是?Observable:

-說它是訂閱者,是因為它能夠動態(tài)地接收新的值。

-說它又是一個?Observable,是因為當?Subjects?有了新的值之后,就會通過?Event?將新值發(fā)出給他的所有訂閱者。

(2)一共有四種?Subjects,分別為:PublishSubject、BehaviorSubject、ReplaySubject、Variable。他們之間既有各自的特點,也有相同之處:

-首先他們都是?Observable,他們的訂閱者都能收到他們發(fā)出的新的?Event。

-直到?Subject?發(fā)出?.complete?或者?.error?的?Event?后,該?Subject?便終結(jié)了,同時它也就不會再發(fā)出?.next?事件。

-對于那些在?Subject?終結(jié)后再訂閱他的訂閱者,也能收到?subject?發(fā)出的一條?.complete?或?.error?的?event,告訴這個新的訂閱者它已經(jīng)終結(jié)了。

-他們之間最大的區(qū)別只是在于:當一個新的訂閱者剛訂閱它的時候,能不能收到?Subject?以前發(fā)出過的舊?Event,如果能的話又能收到多少個。

(3)Subject? 常用的幾個方法:

-onNext(:):是?on(.next(:))?的簡便寫法。該方法相當于?subject?接收到一個?.next?事件。

-onError(:):是?on(.error(:))?的簡便寫法。該方法相當于?subject?接收到一個?.error?事件。

-onCompleted():是?on(.completed)?的簡便寫法。該方法相當于?subject?接收到一個?.completed?事件。

2. PublishSubject

(1)基本介紹

-PublishSubject?是最普通的?Subject,它不需要初始值就能創(chuàng)建。

-PublishSubject?的訂閱者從他們開始訂閱的時間點起,可以收到訂閱后?Subject?發(fā)出的新?Event,而不會收到他們在訂閱前已發(fā)出的?Event。

(2)時序圖

-最上面一條是?PublishSubject。

-下面兩條分別表示兩個新的訂閱,它們訂閱的時間點不同,可以發(fā)現(xiàn)?PublishSubject?的訂閱者只能收到他們訂閱后的?Event。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 RxSwift入坑解讀-你所需要知道的各種概念 沸沸騰關(guān)注 2016.11.27 19:11*字...
    楓葉1234閱讀 2,937評論 0 2
  • 本文章內(nèi)部分圖片資源來自RayWenderlich.com 本文結(jié)合自己的理解來總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 3,044評論 4 14
  • 最近在學習RxSwift相關(guān)的內(nèi)容,在這里記錄一些基本的知識點,以便今后查閱。 Observable 在RxSwi...
    L_Zephyr閱讀 1,897評論 1 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,605評論 19 139
  • CSS和JS在網(wǎng)頁中的放置順序是怎樣的? CSS應(yīng)該放在網(wǎng)頁的 標簽之內(nèi) JavaScript可以放在網(wǎng)頁的任何位...
    饑人谷_啦啦啦閱讀 239評論 0 0

友情鏈接更多精彩內(nèi)容