RXSwift基本概念學(xué)習(xí)

Introduction:

Creating and Subscribing to Observables:

There are several ways to create and subscribe to Observable sequences.

never:

Creates a sequence that never terminates and never emits any events.more info

    let disposeBag = DisposeBag()
    let neverSequence = Observable<String>.never()
    
    let neverSequenceSubscription = neverSequence
        .subscribe { _ in
            print("This will never be printed")
    }
    
    neverSequenceSubscription.disposed(by: disposeBag)

empty:

Creates an empty Observable sequence that only emits a Completed event. [More info](Creates an empty Observable sequence that only emits a Completed event. More info)

    let disposeBag = DisposeBag()
    
    Observable<Int>.empty()
        .subscribe { event in
            print(event)
        }
        .disposed(by: disposeBag)

just:

Creates an Observable sequence with a single element. More info

    let disposeBag = DisposeBag()
    
    Observable.just("??")
        .subscribe { event in
            print(event)
        }
        .disposed(by: disposeBag)

of:

Creates an Observable sequence with a fixed number of elements.

    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??")
        .subscribe(onNext: { element in
            print(element)
        })
        .disposed(by: disposeBag)

from:

Creates an Observable sequence from a Sequence, such as an Array, Dictionary, or Set.

    let disposeBag = DisposeBag()
    
    Observable.from(["??", "??", "??", "??"])
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

create:

Creates a custom Observable sequence. More info

    let disposeBag = DisposeBag()
    
    let myJust = { (element: String) -> Observable<String> in
        return Observable.create { observer in
            observer.on(.next(element))
            observer.on(.completed)
            return Disposables.create()
        }
    }
        
    myJust("??")
        .subscribe { print($0) }
        .disposed(by: disposeBag)

range:

Creates an Observable sequence that emits a range of sequential integers and then terminates. More info

    let disposeBag = DisposeBag()
    
    Observable.range(start: 1, count: 10)
        .subscribe { print($0) }
        .disposed(by: disposeBag)

repeatElement:

Creates an Observable sequence that emits the given element indefinitely. More info

    let disposeBag = DisposeBag()
    
    Observable.repeatElement("??")
        .take(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

generate:

Creates an Observable sequence that generates values for as long as the provided condition evaluates to true.

    let disposeBag = DisposeBag()
    
    Observable.generate(
            initialState: 0,
            condition: { $0 < 3 },
            iterate: { $0 + 1 }
        )
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

deferred:

Creates a new Observable sequence for each subscriber. More info

    let disposeBag = DisposeBag()
    var count = 1
    
    let deferredSequence = Observable<String>.deferred {
        print("Creating \(count)")
        count += 1
        
        return Observable.create { observer in
            print("Emitting...")
            observer.onNext("??")
            observer.onNext("??")
            observer.onNext("??")
            return Disposables.create()
        }
    }
    
    deferredSequence
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    deferredSequence
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

error:

Creates an Observable sequence that emits no items and immediately terminates with an error.

    let disposeBag = DisposeBag()
        
    Observable<Int>.error(TestError.test)
        .subscribe { print($0) }
        .disposed(by: disposeBag)

doOn:

Invokes a side-effect action for each emitted event and returns (passes through) the original event. More info

    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??")
        .do(onNext: { print("Intercepted:", $0) }, onError: { print("Intercepted error:", $0) }, onCompleted: { print("Completed")  })
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

Working with Subjects:

A Subject is a sort of bridge or proxy that is available in some implementations of Rx that acts as both an observer and Observable. Because it is an observer, it can subscribe to one or more Observables, and because it is an Observable, it can pass through the items it observes by reemitting them, and it can also emit new items. More info
一個(gè)Subject是一種橋梁或代理,在Rx的一些實(shí)現(xiàn)中可用作觀察者和Observable槽华。因?yàn)樗且粋€(gè)觀察者涣达,所以可以訂閱一個(gè)或多個(gè)Observable,由于它是一個(gè)Observable厦坛,它可以通過(guò)重新發(fā)送它們來(lái)通過(guò)它觀察到的項(xiàng)目够傍,也可以發(fā)出新的項(xiàng)目。

    /**
     Add observer with `id` and print each emitted event.
     - parameter id: an identifier for the subscription.
     */
    func addObserver(_ id: String) -> Disposable {
        return subscribe { print("Subscription:", id, "Event:", $0) }
    }

PublishSubject:

Broadcasts new events to all observers as of their time of the subscription.
在觀察者訂閱的時(shí)間向它們廣播新的事件。

    let disposeBag = DisposeBag()
    let subject = PublishSubject<String>()
    
    subject.addObserver("1").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
    
    subject.addObserver("2").disposed(by: disposeBag)
    subject.onNext("???")
    subject.onNext("???")
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)

ReplaySubject:

Broadcasts new events to all subscribers, and the specified bufferSize number of previous events to new subscribers.
向所有訂閱者廣播新事件蚓挤,并向新訂閱者廣播指定以前事件序列中緩沖區(qū)大小數(shù)量的事件(從后往前數(shù))。

    let disposeBag = DisposeBag()
    let subject = ReplaySubject<String>.create(bufferSize: 1)
    
    subject.addObserver("1").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
    
    subject.addObserver("2").disposed(by: disposeBag)
    subject.onNext("???")
    subject.onNext("???")
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)

BehaviorSubject:

Broadcasts new events to all subscribers, and the most recent (or initial) value to new subscribers.

向所有用戶廣播新的事件驻子,并向新的用戶提供最近(或最初)的價(jià)值灿意。

    let disposeBag = DisposeBag()
    let subject = BehaviorSubject(value: "??")
    
    subject.addObserver("1").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
    
    subject.addObserver("2").disposed(by: disposeBag)
    subject.onNext("???")
    subject.onNext("???")
    
    subject.addObserver("3").disposed(by: disposeBag)
    subject.onNext("??")
    subject.onNext("??")
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 3 Event: next(???)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 3 Event: next(??)

Variable:

Wraps a BehaviorSubject, so it will emit the most recent (or initial) value to new subscribers. And Variable also maintains current value state. Variable will never emit an Error event. However, it will automatically emit a Completed event and terminate on deinit.
包裝一個(gè)BehaviorSubject,所以它會(huì)發(fā)送最新的(或初始)值給新的觀察者拴孤。Variable也保持當(dāng)前值狀態(tài)脾歧。Variable將永遠(yuǎn)不會(huì)發(fā)出一個(gè)錯(cuò)誤事件。但是演熟,它會(huì)自動(dòng)發(fā)出一個(gè)Completed事件鞭执,并在deinit終止。

    let disposeBag = DisposeBag()
    let variable = Variable("??")
    
    variable.asObservable().addObserver("1").disposed(by: disposeBag)
    variable.value = "??"
    variable.value = "??"
    
    variable.asObservable().addObserver("2").disposed(by: disposeBag)
    variable.value = "???"
    variable.value = "???"
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 1 Event: next(??)
Subscription: 2 Event: next(??)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: next(???)
Subscription: 2 Event: next(???)
Subscription: 1 Event: completed
Subscription: 2 Event: completed

Subject詳細(xì)介紹


Combining_Operators 聯(lián)合操作符

聯(lián)合多個(gè)Observable到一個(gè)Observable

startWith:

Emits the specified sequence of elements before beginning to emit the elements from the source Observable. More info
在開(kāi)始發(fā)送原始的元素序列之前芒粹,發(fā)射指定的元素序列兄纺。
你可以鏈?zhǔn)降膶?duì)一個(gè)Observable調(diào)用多次startWith,但是發(fā)射的序列是按后進(jìn)先出(last-in-first-out)的方式化漆,即后startWith的元素序列會(huì)先發(fā)射出去

    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??")
        .startWith("1??")
        .startWith("2??")
        .startWith("3??", "???", "???")
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
3?? 
??? 
??? 
2?? 
1?? 
?? 
?? 
?? 
??

merge:

Combines elements from source Observable sequences into a single new Observable sequence, and will emit each element as it is emitted by each source Observable sequence. More info
結(jié)合多個(gè)發(fā)射序列為一個(gè)新的序列

    let disposeBag = DisposeBag()
    
    let subject1 = PublishSubject<String>()
    let subject2 = PublishSubject<String>()
    
    Observable.of(subject1, subject2)
        .merge()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    subject1.onNext("???")
    
    subject1.onNext("???")
    
    subject2.onNext("①")
    
    subject2.onNext("②")
    
    subject1.onNext("??")
    
    subject2.onNext("③")
??? 
??? 
① 
② 
?? 
③

zip:

Combines up to 8 source Observable sequences into a single new Observable sequence, and will emit from the combined Observable sequence the elements from each of the source Observable sequences at the corresponding index. More info
將最多8個(gè)源“Observable”序列組合成一個(gè)新的“Observable”序列估脆,并且將從組合的“Observable”序列發(fā)出來(lái)自相應(yīng)索引處的每個(gè)源“Observable”序列的元素。發(fā)射的序列個(gè)數(shù)是根據(jù)最少的序列個(gè)數(shù)來(lái)定的

    let stringSubject = PublishSubject<String>()
    let intSubject = PublishSubject<Int>()
    let intSubject2 = PublishSubject<Int>()

    Observable.zip(stringSubject, intSubject, intSubject2) { stringElement, intElement, int2 in
        "\(stringElement) \(intElement) \(int2)"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    stringSubject.onNext("???")
    stringSubject.onNext("???")
    intSubject2.onNext(3)
    intSubject2.onNext(5)
    intSubject.onNext(1)
    
    intSubject.onNext(2)
    
    stringSubject.onNext("??")
    intSubject.onNext(3)

??? 1 3

??? 2 5

combineLatest:

Combines up to 8 source Observable sequences into a single new Observable sequence, and will begin emitting from the combined Observable sequence the latest elements of each source Observable sequence once all source sequences have emitted at least one element, and also when any of the source Observable sequences emits a new element. More info
將最多8個(gè)源Observable序列組合成一個(gè)新的Observable序列座云,并且一旦所有源序列發(fā)射至少一個(gè)元素疙赠,將從組合的Observable序列開(kāi)始發(fā)射每個(gè)源“可觀察”序列的最新元素,還有當(dāng)任何源Observable序列發(fā)出一個(gè)新的元素時(shí)候朦拖,也從其它Observable中拿出最近的元素來(lái)組合發(fā)射

    let disposeBag = DisposeBag()
    
    let stringSubject = PublishSubject<String>()
    let intSubject = PublishSubject<Int>()
    
    Observable.combineLatest(stringSubject, intSubject) { stringElement, intElement in
            "\(stringElement) haha \(intElement)"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    stringSubject.onNext("???")
    
    stringSubject.onNext("???")
    intSubject.onNext(1)
    
    intSubject.onNext(2)
    
    stringSubject.onNext("??")
??? haha 1
??? haha 2
?? haha 2

Array.combineLatest 和combineLatest類似

    let disposeBag = DisposeBag()
    
    let stringObservable = Observable.just("??")
    let fruitObservable = Observable.from(["??", "??", "??"])
    let animalObservable = Observable.of("??", "??", "??", "??")
    
    Observable.combineLatest([stringObservable, fruitObservable, animalObservable]) {
            "\($0[0]) \($0[1]) \($0[2])"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
?? ?? ??
?? ?? ??
?? ?? ??
?? ?? ??
?? ?? ??
?? ?? ??

switchLatest:

Transforms the elements emitted by an Observable sequence into Observable sequences, and emits elements from the most recent inner Observable sequence. More info
將由觀察序列發(fā)出的元素轉(zhuǎn)換為觀察序列圃阳,并且只有最新的觀察序列能發(fā)送信號(hào)

    let disposeBag = DisposeBag()
    
    let subject1 = BehaviorSubject(value: "??")
    let subject2 = BehaviorSubject(value: "??")
    
    let variable = Variable(subject1)
        
    variable.asObservable()
        .switchLatest()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    subject1.onNext("??")
    subject1.onNext("??")
    
    variable.value = subject2
    //此時(shí)不會(huì)打印??因?yàn)楫?dāng)前最新的variable是subject2
    subject1.onNext("??")
    
    subject2.onNext("??")
??
??
??
??
??

Transforming_Operators:

Operators that transform Next event elements emitted by an Observable sequence.
轉(zhuǎn)換操作符:轉(zhuǎn)換發(fā)射的Next事件元素到一個(gè)新的Observable序列

map:

Applies a transforming closure to elements emitted by an Observable sequence, and returns a new Observable sequence of the transformed elements.
將變換閉包應(yīng)用于由“Observable”序列發(fā)出的元素,并返回變換元素的一個(gè)新的“Observable”序列璧帝。

example("map") {
    let disposeBag = DisposeBag()
    Observable.of(1, 2, 3)
        .map { $0 * $0 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}
1
4
9

flatMap and flatMapLatest:

Transforms the elements emitted by an Observable sequence into Observable sequences, and merges the emissions from both Observable sequences into a single Observable sequence. This is also useful when, for example, when you have an Observable sequence that itself emits Observable sequences, and you want to be able to react to new emissions from either Observable sequence. The difference between flatMap and flatMapLatest is, flatMapLatest will only emit elements from the most recent inner Observable sequence.
將由“可觀察”序列發(fā)射的元素轉(zhuǎn)換為“可觀察”序列捍岳,并將來(lái)自兩個(gè)“可觀察”序列的發(fā)射合并成單個(gè)“可觀察”序列。例如睬隶,當(dāng)你有一個(gè)本身發(fā)出“可觀察”序列的“可觀察”序列锣夹,并且你希望能夠?qū)?lái)自“可觀察”序列的新發(fā)射作出反應(yīng)時(shí),這也是有用的苏潜。 “flatMap”和“flatMapLatest”的區(qū)別在于银萍,“flatMapLatest”只會(huì)從最近的“Observable”內(nèi)部發(fā)出元素。
flatMapLatest是map和switchLatest的結(jié)合體恤左。

    let disposeBag = DisposeBag()
    
    struct Player {
        var score: Variable<Int>
    }
    
    let ???? = Player(score: Variable(80))
    let ???? = Player(score: Variable(90))
    
    let player = Variable(????)
    
    player.asObservable()
        .flatMapLatest { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    ????.score.value = 85
    
    player.value = ????
    
    ????.score.value = 95 // Will be printed when using flatMap, but will not be printed when using flatMapLatest
    
    ????.score.value = 100
80
85
90
100

scan:

Begins with an initial seed value, and then applies an accumulator closure to each element emitted by an Observable sequence, and returns each intermediate result as a single-element Observable sequence.
從一個(gè)初始的種子值開(kāi)始贴唇,然后對(duì)由“可觀察”序列發(fā)出的每個(gè)元素應(yīng)用累加器閉包贰锁,并將每個(gè)中間結(jié)果作為單元素“可觀察”序列返回。

let disposeBag = DisposeBag()
    
    Observable.of(10, 100, 1000)
        .scan(1) { aggregateValue, newValue in
            aggregateValue + newValue
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
        
11
111
1111

Filtering and Conditional Operators:

Operators that selectively emit elements from a source Observable sequence.
有選擇地從源“Observable”序列中發(fā)射元素的運(yùn)算符

filter:

Emits only those elements from an Observable sequence that meet the specified condition.

僅從符合指定條件的“可觀察”序列中發(fā)射那些元素

    let disposeBag = DisposeBag()
    
    Observable.of(
        "??", "??", "??",
        "??", "??", "??",
        "??", "??", "??")
        .filter {
            $0 == "??"
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??

distinctUntilChanged:

Suppresses sequential duplicate elements emitted by an Observable sequence.More info
抑制由“可觀察”序列發(fā)出的連續(xù)重復(fù)元素滤蝠。
[圖片上傳失敗...(image-c60fb6-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??", "??", "??", "??")
        .distinctUntilChanged()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??
??
??

elementAt:

Emits only the element at the specified index of all elements emitted by an Observable sequence. More info
僅發(fā)出由“Observable”序列發(fā)出的所有元素的指定索引處的元素
[圖片上傳失敗...(image-4979d3-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .elementAt(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??

single:

Emits only the first element (or the first element that meets a condition) emitted by an Observable sequence. Will throw an error if the Observable sequence does not emit exactly one element.
僅發(fā)出由“可觀察”序列發(fā)出的第一個(gè)元素(或符合條件的第一個(gè)元素)。如果Observable序列不是只發(fā)出一個(gè)元素授嘀,會(huì)拋出一個(gè)錯(cuò)誤物咳。

example("single") {
    let disposeBag = DisposeBag()
    
    Observable.of("??")
        .single()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

example("single with conditions") {
    let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .single { $0 == "??" }
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .single { $0 == "??" }
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .single { $0 == "??" }
        .subscribe { print($0) }
        .disposed(by: disposeBag)
}
--- single example ---
??

--- single with conditions example ---
next(??)
completed
next(??)
error(Sequence contains more than one element.)
error(Sequence doesn't contain any elements.)

take:

Emits only the specified number of elements from the beginning of an Observable sequence. More info
僅從“可觀察”序列的開(kāi)始處發(fā)射指定數(shù)量的元素。

[圖片上傳失敗...(image-546204-1515048671653)]

     let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .take(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??

takeLast:

Emits only the specified number of elements from the end of an Observable sequence. More info
僅從"可觀察"序列的末尾處發(fā)射指定數(shù)量的元素蹄皱。注意:發(fā)射元素的順序不變览闰,只不過(guò)是從后往前數(shù),從第幾個(gè)開(kāi)始發(fā)射巷折。
[圖片上傳失敗...(image-789c87-1515048671653)]

     let disposeBag = DisposeBag()
    
    Observable.of("??", "??", "??", "??", "??", "??")
        .takeLast(3)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??

takeWhile:

Emits elements from the beginning of an Observable sequence as long as the specified condition evaluates to true. More info
只要指定的條件評(píng)估為“真”压鉴,就從“可觀察”序列的開(kāi)始處發(fā)射元素。從開(kāi)始往后锻拘,如果有元素不滿足條件油吭,將發(fā)射completed事件而不再發(fā)射元素。

[圖片上傳失敗...(image-34022b-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.of(1, 2, 3, 4, 5, 6)
        .takeWhile { $0 % 2 == 0 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

1
2
3

takeUntil:

Emits elements from a source Observable sequence until a reference Observable sequence emits an element. More info

從源Observable序列中發(fā)射元素署拟,直到參考Observable序列發(fā)射一個(gè)元素婉宰。

[圖片上傳失敗...(image-7af76f-1515048671653)]

    let disposeBag = DisposeBag()
    
    let sourceSequence = PublishSubject<String>()
    let referenceSequence = PublishSubject<String>()
    
    sourceSequence
        .takeUntil(referenceSequence)
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    
    referenceSequence.onNext("??")
    
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
next(??)
next(??)
next(??)
completed

skip:

Suppresses emitting the specified number of elements from the beginning of an Observable sequence. More info
禁止從“可觀察”序列的開(kāi)始發(fā)射指定數(shù)量的元素。

[圖片上傳失敗...(image-63e34f-1515048671653)]

    Observable.of("??", "??", "??", "??", "??", "??")
        .skip(2)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??
??

skipWhile:

Suppresses emitting the elements from the beginning of an Observable sequence that meet the specified condition. More info
禁止從符合指定條件的“可觀察”序列開(kāi)始發(fā)射元素推穷。

[圖片上傳失敗...(image-8d937f-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.of(1, 2, 3, 4, 5, 6)
        .skipWhile { $0 < 4 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

4
5
6

skipWhileWithIndex:

Suppresses emitting the elements from the beginning of an Observable sequence that meet the specified condition, and emits the remaining elements. The closure is also passed each element's index.
禁止從符合指定條件的“可觀察”序列開(kāi)始發(fā)射元素心包,并發(fā)射其余元素。閉包也傳遞每個(gè)元素的索引馒铃。

    Observable.of("??", "??", "??", "??", "??", "??")
        .skipWhileWithIndex { element, index in
            index < 3
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??

skipUntil:

Suppresses emitting the elements from a source Observable sequence until a reference Observable sequence emits an element. More info
禁止從源“Observable”序列發(fā)射元素蟹腾,直到引用“Observable”序列發(fā)射一個(gè)元素馍管。

[圖片上傳失敗...(image-301338-1515048671653)]

     let disposeBag = DisposeBag()
    
    let sourceSequence = PublishSubject<String>()
    let referenceSequence = PublishSubject<String>()
    
    sourceSequence
        .skipUntil(referenceSequence)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
    
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    
    referenceSequence.onNext("??")
    
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
    sourceSequence.onNext("??")
??
??
??

Mathematical and Aggregate Operators:

Operators that operate on the entire sequence of items emitted by an Observable.

對(duì)Observable發(fā)出的所有項(xiàng)目進(jìn)行操作的操作符奠涌。

toArray:

Converts an Observable sequence into an array, emits that array as a new single-element Observable sequence, and then terminates. More info

將一個(gè)Observable序列轉(zhuǎn)換為一個(gè)數(shù)組,將該數(shù)組作為一個(gè)新的單元素Observable序列發(fā)送世蔗,然后終止萧锉。

[圖片上傳失敗...(image-4368b4-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.range(start: 1, count: 10)
        .toArray()
        .subscribe { print($0) }
        .disposed(by: disposeBag)
next([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
completed

reduce:

Begins with an initial seed value, and then applies an accumulator closure to all elements emitted by an Observable sequence, and returns the aggregate result as a single-element Observable sequence. More info
以一個(gè)初始的種子值開(kāi)始珊随,然后將一個(gè)累加器閉包應(yīng)用于由一個(gè)“可觀察”序列發(fā)出的所有元素,并且將該聚合結(jié)果作為單元素“可觀察”序列返回柿隙。

[圖片上傳失敗...(image-3c1124-1515048671653)]

    let disposeBag = DisposeBag()
    
    Observable.of(10, 100, 1000)
        .reduce(1, accumulator: +)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
1111

concat:

Joins elements from inner Observable sequences of an Observable sequence in a sequential manner, waiting for each sequence to terminate successfully before emitting elements from the next sequence. More info
以順序的方式連接來(lái)自“Observable”序列的內(nèi)部“可觀察”序列的元素叶洞,等待每個(gè)序列在從下一個(gè)序列發(fā)射元素之前成功終止。

[圖片上傳失敗...(image-a9255f-1515048671653)]

    let disposeBag = DisposeBag()
    
    let subject1 = BehaviorSubject(value: "??")
    let subject2 = BehaviorSubject(value: "??")
    
    let variable = Variable(subject1)
    
    variable.asObservable()
        .concat()
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    subject1.onNext("??")
    subject1.onNext("??")
    
    variable.value = subject2

    subject2.onNext("I would be ignored")

    subject2.onNext("??")
    subject1.onCompleted()
    
    subject2.onNext("??")
next(??)
next(??)
next(??)
next(??)
next(??)

Connectable Operators:

Connectable Observable sequences resembles ordinary Observable sequences, except that they not begin emitting elements when subscribed to, but instead, only when their connect() method is called. In this way, you can wait for all intended subscribers to subscribe to a connectable Observable sequence before it begins emitting elements.
可連接的Observable序列與普通的Observable序列相似禀崖,只不過(guò)它們?cè)谟嗛啎r(shí)不會(huì)開(kāi)始發(fā)射元素衩辟,而只是在調(diào)用connect()方法的時(shí)候。通過(guò)這種方式波附,您可以等待所有預(yù)定用戶在開(kāi)始發(fā)射元素之前預(yù)訂可連接的“可觀察”序列艺晴。

interval:

interval creates an Observable sequence that emits elements after each period, on the specified scheduler. More info
interval在指定的調(diào)度器上創(chuàng)建一個(gè)Observable序列昼钻,在每個(gè)`period“之后發(fā)出元素。
[圖片上傳失敗...(image-237b29-1515048671653)]

    let interval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
   
   _ = interval
       .subscribe(onNext: { print("Subscription: 1, Event: \($0)") })
   
   delay(5) {
       _ = interval
           .subscribe(onNext: { print("Subscription: 2, Event: \($0)") })
   }

Subscription: 1, Event: 0
Subscription: 1, Event: 1
Subscription: 1, Event: 2
Subscription: 1, Event: 3
Subscription: 1, Event: 4
Subscription: 1, Event: 5
Subscription: 2, Event: 0
Subscription: 1, Event: 6
Subscription: 2, Event: 1
Subscription: 1, Event: 7
Subscription: 2, Event: 2
Subscription: 1, Event: 8
Subscription: 2, Event: 3
Subscription: 1, Event: 9
Subscription: 2, Event: 4
Subscription: 1, Event: 10
Subscription: 2, Event: 5
Subscription: 1, Event: 11

publish:

Converts the source Observable sequence into a connectable sequence. More info

將源“Observable”序列轉(zhuǎn)換為可連接的序列封寞。

[圖片上傳失敗...(image-70b1a9-1515048671654)]

    let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        .publish()
    
    _ = intSequence
        .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
        
    //如果我把這個(gè)connect延遲設(shè)為6的話然评,3個(gè)觀察會(huì)一起打印
    delay(2) { _ = intSequence.connect() }
    
    delay(4) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
    }
    
    delay(6) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
    }

Subscription 1:, Event: 0
Subscription 1:, Event: 1
Subscription 2:, Event: 1
Subscription 1:, Event: 2
Subscription 2:, Event: 2
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 3:, Event: 3
Subscription 1:, Event: 4
Subscription 2:, Event: 4
Subscription 3:, Event: 4
Subscription 1:, Event: 5
Subscription 2:, Event: 5
Subscription 3:, Event: 5
Subscription 1:, Event: 6
Subscription 2:, Event: 6
Subscription 3:, Event: 6

Schedulers are an abstraction of mechanisms for performing work, such as on specific threads or dispatch queues. More info

replay:

Converts the source Observable sequence into a connectable sequence, and will replay bufferSize number of previous emissions to each new subscriber.More info
將源“Observable”序列轉(zhuǎn)換為可連接的序列,并將向每個(gè)新訂戶播放先前發(fā)射的“bufferSize”數(shù)量狈究。
[圖片上傳失敗...(image-d7ede6-1515048671654)]

    let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        .replay(5)
    
    _ = intSequence
        .subscribe(onNext: { print("Subscription 1:, Event: \($0)") })
    
    delay(2) { _ = intSequence.connect() }
    
    delay(4) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 2:, Event: \($0)") })
    }
    
    delay(8) {
        _ = intSequence
            .subscribe(onNext: { print("Subscription 3:, Event: \($0)") })
    }
Subscription 1:, Event: 0
Subscription 1:, Event: 1
Subscription 1:, Event: 2
Subscription 2:, Event: 0
Subscription 2:, Event: 1
Subscription 2:, Event: 2
Subscription 1:, Event: 3
Subscription 2:, Event: 3
Subscription 1:, Event: 4
Subscription 2:, Event: 4
Subscription 1:, Event: 5
Subscription 2:, Event: 5
Subscription 1:, Event: 6
Subscription 2:, Event: 6
Subscription 3:, Event: 2
Subscription 3:, Event: 3
Subscription 3:, Event: 4
Subscription 3:, Event: 5
Subscription 3:, Event: 6
Subscription 1:, Event: 7
Subscription 2:, Event: 7
Subscription 3:, Event: 7

multicast:

Converts the source Observable sequence into a connectable sequence, and broadcasts its emissions via the specified subject.
將源“Observable”序列轉(zhuǎn)換為可連接的序列碗淌,并通過(guò)指定的“subject”廣播其發(fā)射。會(huì)先發(fā)射“subject”的事件抖锥。

    let subject = PublishSubject<Int>()
    
    _ = subject
        .subscribe(onNext: { print("Subject: \($0)") })
    
    let intSequence = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        .multicast(subject)
    
    _ = intSequence
        .subscribe(onNext: { print("\tSubscription 1:, Event: \($0)") })
    
    delay(2) { _ = intSequence.connect() }
    
    delay(4) {
        _ = intSequence
            .subscribe(onNext: { print("\tSubscription 2:, Event: \($0)") })
    }
    
    delay(6) {
        _ = intSequence
            .subscribe(onNext: { print("\tSubscription 3:, Event: \($0)") })
    }


Subject: 0
    Subscription 1:, Event: 0
Subject: 1
    Subscription 1:, Event: 1
    Subscription 2:, Event: 1
Subject: 2
    Subscription 1:, Event: 2
    Subscription 2:, Event: 2
Subject: 3
    Subscription 1:, Event: 3
    Subscription 2:, Event: 3
    Subscription 3:, Event: 3
Subject: 4
    Subscription 1:, Event: 4
    Subscription 2:, Event: 4
    Subscription 3:, Event: 4
Subject: 5
    Subscription 1:, Event: 5
    Subscription 2:, Event: 5
    Subscription 3:, Event: 5

Error Handling Operators:

Operators that help to recover from error notifications from an Observable.
有助于從Observable的錯(cuò)誤通知中恢復(fù)的操作符亿眠。

catchErrorJustReturn:

Recovers from an Error event by returning an Observable sequence that emits a single element and then terminates. More info
通過(guò)返回發(fā)出單個(gè)元素的Observable序列,從一個(gè)原始序列中恢復(fù)錯(cuò)誤磅废,然后終止纳像。
[圖片上傳失敗...(image-29b9cd-1515048671654)]

    let disposeBag = DisposeBag()
    
    let sequenceThatFails = PublishSubject<String>()
    
    sequenceThatFails
        .catchErrorJustReturn("??")
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onError(TestError.test)

next(??)
next(??)
next(??)
next(??)
next(??)
completed

catchError:

Recovers from an Error event by switching to the provided recovery Observable sequence. More info
通過(guò)轉(zhuǎn)換到提供的恢復(fù)Observable序列,恢復(fù)一個(gè)錯(cuò)誤拯勉。

[圖片上傳失敗...(image-e72e5c-1515048671654)]

    let disposeBag = DisposeBag()
    
    let sequenceThatFails = PublishSubject<String>()
    let recoverySequence = PublishSubject<String>()
    
    sequenceThatFails
        .catchError {
            print("Error:", $0)
            return recoverySequence
        }
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onNext("??")
    sequenceThatFails.onError(TestError.test)
    
    recoverySequence.onNext("??")
next(??)
next(??)
next(??)
next(??)
Error: test
next(??)

retry:

Recovers repeatedly Error events by resubscribing to the Observable sequence, indefinitely. More info
通過(guò)無(wú)限期地重新訂閱“可觀察”序列來(lái)重復(fù)恢復(fù)錯(cuò)誤事件竟趾。
[圖片上傳失敗...(image-46b3bf-1515048671654)]

    let disposeBag = DisposeBag()
    var count = 1
    
    let sequenceThatErrors = Observable<String>.create { observer in
        observer.onNext("??")
        observer.onNext("??")
        observer.onNext("??")
        
        if count == 1 {
            observer.onError(TestError.test)
            print("Error encountered")
            count += 1
        }
        
        observer.onNext("??")
        observer.onNext("??")
        observer.onNext("??")
        observer.onCompleted()
        
        return Disposables.create()
    }
    
    sequenceThatErrors
        .retry()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
??
??
??
Error encountered
??
??
??
??
??
??

retry(_:):

Recovers repeatedly from Error events by resubscribing to the Observable sequence, up to maxAttemptCount number of retries. More info
通過(guò)重新訂閱“Observable”序列,直到“maxAttemptCount”重試次數(shù)谜喊,從錯(cuò)誤事件中重復(fù)恢復(fù)
[圖片上傳失敗...(image-9cffd1-1515048671654)]

    let disposeBag = DisposeBag()
   var count = 1
   
   let sequenceThatErrors = Observable<String>.create { observer in
       observer.onNext("??")
       observer.onNext("??")
       observer.onNext("??")
       
       if count < 5 {
           observer.onError(TestError.test)
           print("Error encountered")
           count += 1
       }
       
       observer.onNext("??")
       observer.onNext("??")
       observer.onNext("??")
       observer.onCompleted()
       
       return Disposables.create()
   }
   
   sequenceThatErrors
       .retry(3)
       .subscribe(onNext: { print($0) })
       .disposed(by: disposeBag)
??
??
??
Error encountered
??
??
??
Error encountered
??
??
??
Error encountered

Debugging Operators:Operators to help debug Rx code.

幫助調(diào)試Rx代碼的操作符潭兽。

debug:

Prints out all subscriptions, events, and disposals.
打印出所有的訂閱,事件和處理斗遏。

    let disposeBag = DisposeBag()
    var count = 1
    
    let sequenceThatErrors = Observable<String>.create { observer in
        observer.onNext("??")
        observer.onNext("??")
        observer.onNext("??")
        
        if count < 5 {
            observer.onError(TestError.test)
            print("Error encountered")
            count += 1
        }
        
        observer.onNext("??")
        observer.onNext("??")
        observer.onNext("??")
        observer.onCompleted()
        
        return Disposables.create()
    }
    
    sequenceThatErrors
        .retry(3)
        .debug()
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
2017-12-08 09:43:16.702: Rx.playground:42 (__lldb_expr_289) -> subscribed
2017-12-08 09:43:16.704: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.704: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.704: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
Error encountered
2017-12-08 09:43:16.706: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.706: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.706: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
Error encountered
2017-12-08 09:43:16.708: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.708: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
2017-12-08 09:43:16.708: Rx.playground:42 (__lldb_expr_289) -> Event next(??)
??
Error encountered
2017-12-08 09:43:16.709: Rx.playground:42 (__lldb_expr_289) -> Event error(test)
Unhandled error happened: test

RxSwift.Resources.total:

Provides a count of all Rx resource allocations, which is useful for detecting leaks during development.
提供所有Rx資源分配的計(jì)數(shù)山卦,這對(duì)于在開(kāi)發(fā)過(guò)程中檢測(cè)泄漏非常有用。

example("RxSwift.Resources.total") {
    print(RxSwift.Resources.total)
    
    let disposeBag = DisposeBag()
    
    print(RxSwift.Resources.total)
    
    let variable = Variable("??")
    
    let subscription1 = variable.asObservable().subscribe(onNext: { print($0) })
    
    print(RxSwift.Resources.total)
    
    let subscription2 = variable.asObservable().subscribe(onNext: { print($0) })
    
    print(RxSwift.Resources.total)
    
    subscription1.dispose()
    
    print(RxSwift.Resources.total)
    
    subscription2.dispose()
    
    print(RxSwift.Resources.total)
}
    
print(RxSwift.Resources.total)
1
3
??
12
??
15
13
11
1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诵次,一起剝皮案震驚了整個(gè)濱河市账蓉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逾一,老刑警劉巖铸本,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異遵堵,居然都是意外死亡箱玷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門陌宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锡足,“玉大人,你說(shuō)我怎么就攤上這事壳坪〔暗茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵爽蝴,是天一觀的道長(zhǎng)沐批。 經(jīng)常有香客問(wèn)我纫骑,道長(zhǎng),這世上最難降的妖魔是什么九孩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任先馆,我火速辦了婚禮,結(jié)果婚禮上躺彬,老公的妹妹穿的比我還像新娘磨隘。我一直安慰自己,他們只是感情好顾患,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著个唧,像睡著了一般江解。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徙歼,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天犁河,我揣著相機(jī)與錄音,去河邊找鬼魄梯。 笑死桨螺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酿秸。 我是一名探鬼主播灭翔,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辣苏!你這毒婦竟也來(lái)了肝箱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稀蟋,失蹤者是張志新(化名)和其女友劉穎煌张,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體退客,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骏融,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌狂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档玻。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粥脚,靈堂內(nèi)的尸體忽然破棺而出窃肠,到底是詐尸還是另有隱情,我是刑警寧澤刷允,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布冤留,位于F島的核電站碧囊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纤怒。R本人自食惡果不足惜糯而,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泊窘。 院中可真熱鬧熄驼,春花似錦、人聲如沸烘豹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)携悯。三九已至祭芦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憔鬼,已是汗流浹背龟劲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轴或,地道東北人昌跌。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像照雁,于是被迫代替她去往敵國(guó)和親蚕愤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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