創(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。