RxSwift 这个框架看我就够了,这一篇我重点介绍
Subject
这个可攻可受的好东西。搞RxSwift
,我是认真的
RxSwift 宝图镇博,咔咔点赞~~~~
-
RxSwift 深入浅出(一)RxSwift初探
-
RxSwift 深入浅出(二)高阶函数
-
RxSwift 深入浅出(三)Subject
-
RxSwift 深入浅出(四)控件应用
-
RxSwift 深入浅出(五)tableView应用
-
RxSwift 深入浅出(六)RxDataSources
-
RxSwift 深入浅出(七)网络封装
-
RxSwift 深入浅出(八)开发总结
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 其实就是对 BehaviorSubject 的封装,所以它也必须要通过一个默认的初始值进行创建。
Variable 具有 BehaviorSubject 的功能,能够向它的订阅者发出上一个 event 以及之后新创建的 event。
不同的是,Variable 还会把当前发出的值保存为自己的状态。同时它会在销毁时自动发送 .complete的 event,不需要也不能手动给 Variables 发送 completed或者 error 事件来结束它。
简单地说就是 Variable 有一个 value 属性,我们改变这个 value 属性的值就相当于调用一般 Subjects 的 onNext() 方法,而这个最新的 onNext() 的值就被保存在 value 属性里了,直到我们再次修改它。
Variables 本身没有 subscribe() 方法,但是所有 Subjects 都有一个 asObservable() 方法。我们可以使用这个方法返回这个 Variable 的 Observable 类型,拿到这个 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 这个警告也是告诉大家,Variable要在接下来的版本里删除,请用BehaviorRelay代替. 其实Variable有封装 所以还挺好用,貌似现在UI层的很多都是Variable,不过RxSwift封装了很多关于UI的,所以,以后会销毁Variable这个类了
}
func testReplaySubject(){
//ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数。
//比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event。
// 如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event外,还会收到那个终结的 .error 或者 .complete 的event。
let subject = ReplaySubject<String>.create(bufferSize: 2)
subject.onNext("Cooci")
subject.onNext("Gavin")
subject.onNext("Kasery")
//Gavin
// Kasery 只打印这两个,Cooci就会从缓存清除
subject.subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("这是一个 完成")
}) {
print("销毁了")
}.disposed(by: disposeB)
subject.onCompleted()//我现在完成了
subject.subscribe(onNext: { (event) in
print(event)
}, onError: { (error) in
print(error)
}, onCompleted: {
print("完成之后的订阅完成")
}) {
print("完成之后销毁了")
}.disposed(by: disposeB)
/**
Gavin
Kasery
这是一个 完成
销毁了
Gavin
Kasery
完成之后的订阅完成
完成之后销毁了
发现完成了还打印了之前缓存的信号
*/
}
func testBehaviorSubject(){
//BehaviorSubject 需要通过一个默认初始值来创建
//当一个订阅者来订阅它的时候,这个订阅者会立即收到 BehaviorSubjects 上一个发出的event。之后就跟正常的情况一样,它也会接收到 BehaviorSubject 之后发出的新的 event
//这个地方正好去人了PublishSubject 订阅之前发出信号无法监听
let subject = BehaviorSubject(value: "Cooci")
// subject.onNext("Gavin")//会替换了Cooci的信号
subject.subscribe(onNext: { (event) in
print(event)
} , onCompleted: {
print("completed")
}) {
print("销毁了")
}.disposed(by: disposeB)
subject.onNext("Kasery")
subject.onNext("123") //这里替换了上面的 Kasery 的信号,但是会打印两次,印上两次订阅都能监听到
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错误"]))
}
func testPublishSuject(){
//Subject 订阅者也是observable
// 1: 能动态地接受新的值
// 2: subject有新的值的时候 通过event把新值发出给所有订阅者
//PublishSubject、BehaviorSubject、ReplaySubject、Variable 区别:当一个新的订阅者刚订阅它的时候,能不能收到 Subject 以前发出过的旧 Event,如果能的话又能收到多少个
//PublishSuject
//PublishSubject是最普通的 Subject,它不需要初始值就能创建。
//订阅者从他们开始订阅的时间点起,可以收到订阅后 Subject 发出的新 Event,而不会收到他们在订阅前已发出的
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结束,后面就在进行订阅
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 :销毁了
只有先订阅,才能监听到event
一旦发出了complete后面的就无法监听
completed fourth
fourth :销毁了
*/
}
}