RxSwift 這個(gè)框架看我就夠了旭贬,這一篇我重點(diǎn)介紹
Subject
這個(gè)可攻可受的好東西。搞RxSwift
搪泳,我是認(rèn)真的
RxSwift 寶圖鎮(zhèn)博,咔咔點(diǎn)贊~~~~
Rxswift
-
RxSwift 深入淺出(一)RxSwift初探
-
RxSwift 深入淺出(二)高階函數(shù)
-
RxSwift 深入淺出(三)Subject
-
RxSwift 深入淺出(四)控件應(yīng)用
-
RxSwift 深入淺出(五)tableView應(yīng)用
-
RxSwift 深入淺出(六)RxDataSources
-
RxSwift 深入淺出(七)網(wǎng)絡(luò)封裝
-
RxSwift 深入淺出(八)開(kāi)發(fā)總結(jié)
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeB = DisposeBag()
var name:String = "name"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Observable<String>.just("Cooci")
// .map { (newName) -> String in
// print(newName)
// return "i am " + newName
// }
// .bind { [weak self](text) in
// print("text == \(text)")
// self?.name = text
// }
// .disposed(by: disposeB)
//Subject
// testPublishSuject()
// testBehaviorSubject()
// testReplaySubject()
testVariable()
}
func testVariable(){
/**
Variable 其實(shí)就是對(duì) BehaviorSubject 的封裝稀轨,所以它也必須要通過(guò)一個(gè)默認(rèn)的初始值進(jìn)行創(chuàng)建。
Variable 具有 BehaviorSubject 的功能岸军,能夠向它的訂閱者發(fā)出上一個(gè) event 以及之后新創(chuàng)建的 event奋刽。
不同的是,Variable 還會(huì)把當(dāng)前發(fā)出的值保存為自己的狀態(tài)艰赞。同時(shí)它會(huì)在銷毀時(shí)自動(dòng)發(fā)送 .complete的 event佣谐,不需要也不能手動(dòng)給 Variables 發(fā)送 completed或者 error 事件來(lái)結(jié)束它。
簡(jiǎn)單地說(shuō)就是 Variable 有一個(gè) value 屬性方妖,我們改變這個(gè) value 屬性的值就相當(dāng)于調(diào)用一般 Subjects 的 onNext() 方法狭魂,而這個(gè)最新的 onNext() 的值就被保存在 value 屬性里了,直到我們?cè)俅涡薷乃?
Variables 本身沒(méi)有 subscribe() 方法党觅,但是所有 Subjects 都有一個(gè) asObservable() 方法雌澄。我們可以使用這個(gè)方法返回這個(gè) Variable 的 Observable 類型,拿到這個(gè) Observable 類型我們就能訂閱它了杯瞻。
*/
let subject = Variable("Cooci")
subject.value = "Gavin"
subject.asObservable().subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("Variber訂閱完成")
}) {
print("Variber銷毀")
}
.disposed(by: disposeB)
subject.value = "Kasery"
//?? [DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx 這個(gè)警告也是告訴大家,Variable要在接下來(lái)的版本里刪除,請(qǐng)用BehaviorRelay代替. 其實(shí)Variable有封裝 所以還挺好用,貌似現(xiàn)在UI層的很多都是Variable,不過(guò)RxSwift封裝了很多關(guān)于UI的,所以,以后會(huì)銷毀Variable這個(gè)類了
}
func testReplaySubject(){
//ReplaySubject 在創(chuàng)建時(shí)候需要設(shè)置一個(gè) bufferSize镐牺,表示它對(duì)于它發(fā)送過(guò)的 event 的緩存?zhèn)€數(shù)。
//比如一個(gè) ReplaySubject 的 bufferSize 設(shè)置為 2魁莉,它發(fā)出了 3 個(gè) .next 的 event睬涧,那么它會(huì)將后兩個(gè)(最近的兩個(gè))event 給緩存起來(lái)。此時(shí)如果有一個(gè) subscriber 訂閱了這個(gè) ReplaySubject旗唁,那么這個(gè) subscriber 就會(huì)立即收到前面緩存的兩個(gè).next 的 event畦浓。
// 如果一個(gè) subscriber 訂閱已經(jīng)結(jié)束的 ReplaySubject,除了會(huì)收到緩存的 .next 的 event外检疫,還會(huì)收到那個(gè)終結(jié)的 .error 或者 .complete 的event讶请。
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("Cooci")
subject.onNext("Gavin")
subject.onNext("Kasery")
//Gavin
// Kasery 只打印這兩個(gè),Cooci就會(huì)從緩存清除
subject.subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("這是一個(gè) 完成")
}) {
print("銷毀了")
}.disposed(by: disposeB)
subject.onCompleted()//我現(xiàn)在完成了
subject.subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("完成之后的訂閱完成")
}) {
print("完成之后銷毀了")
}.disposed(by: disposeB)
/**
Gavin
Kasery
這是一個(gè) 完成
銷毀了
Gavin
Kasery
完成之后的訂閱完成
完成之后銷毀了
發(fā)現(xiàn)完成了還打印了之前緩存的信號(hào)
*/
}
func testBehaviorSubject(){
//BehaviorSubject 需要通過(guò)一個(gè)默認(rèn)初始值來(lái)創(chuàng)建
//當(dāng)一個(gè)訂閱者來(lái)訂閱它的時(shí)候,這個(gè)訂閱者會(huì)立即收到 BehaviorSubjects 上一個(gè)發(fā)出的event电谣。之后就跟正常的情況一樣秽梅,它也會(huì)接收到 BehaviorSubject 之后發(fā)出的新的 event
//這個(gè)地方正好去人了PublishSubject 訂閱之前發(fā)出信號(hào)無(wú)法監(jiān)聽(tīng)
let subject = BehaviorSubject(value: "Cooci")
// subject.onNext("Gavin")//會(huì)替換了Cooci的信號(hào)
subject.subscribe(onNext: { (event) in
print(event)
} , onCompleted: {
print("completed")
}) {
print("銷毀了")
}.disposed(by: disposeB)
subject.onNext("Kasery")
subject.onNext("123") //這里替換了上面的 Kasery 的信號(hào),但是會(huì)打印兩次,印上兩次訂閱都能監(jiān)聽(tīng)到
subject.subscribe(onNext: { (event) in
print(event)
} , onCompleted: {
print("completed")
}) {
print("銷毀了")
}.disposed(by: disposeB)
//這里跟大家玩玩error
subject.onError(NSError(domain: "myError", code: 10086, userInfo: ["myuserinfo":"10086錯(cuò)誤"]))
}
func testPublishSuject(){
//Subject 訂閱者也是observable
// 1: 能動(dòng)態(tài)地接受新的值
// 2: subject有新的值的時(shí)候 通過(guò)event把新值發(fā)出給所有訂閱者
//PublishSubject、BehaviorSubject剿牺、ReplaySubject企垦、Variable 區(qū)別:當(dāng)一個(gè)新的訂閱者剛訂閱它的時(shí)候,能不能收到 Subject 以前發(fā)出過(guò)的舊 Event晒来,如果能的話又能收到多少個(gè)
//PublishSuject
//PublishSubject是最普通的 Subject钞诡,它不需要初始值就能創(chuàng)建。
//訂閱者從他們開(kāi)始訂閱的時(shí)間點(diǎn)起,可以收到訂閱后 Subject 發(fā)出的新 Event荧降,而不會(huì)收到他們?cè)谟嗛喦耙寻l(fā)出的
let subject = PublishSubject<String>()
subject.onNext("Cooci")
subject.subscribe(onNext: { (event) in
print("this is"+event)
}, onCompleted: {
print("completed")
}) {
print("銷毀了")
}.disposed(by: disposeB)
subject.onNext("Gavin")
subject.subscribe(onNext: { (event) in
print("this is second"+event)
}, onCompleted: {
print("completed second")
}) {
print("second :銷毀了")
}.disposed(by: disposeB)
//讓subject結(jié)束,后面就在進(jìn)行訂閱
subject.onCompleted()
subject.onNext("Kasery")
subject.onNext("4444")
subject.subscribe(onNext: { (event) in
print("this is fourth"+event)
}, onCompleted: {
print("completed fourth")
}) {
print("fourth :銷毀了")
}.disposed(by: disposeB)
/**
this isGavin
completed
銷毀了
completed second
second :銷毀了
只有先訂閱,才能監(jiān)聽(tīng)到event
一旦發(fā)出了complete后面的就無(wú)法監(jiān)聽(tīng)
completed fourth
fourth :銷毀了
*/
}
}