RxSwift-dispose源码解析
2024-01-28 04:00:34
任何对象都有生命周期,有创建就要销毁。OC中有init和dealloc,swift有init和deinit,RxSwift也不例外,RxSwift有create和dispose。下面就看看dispose是如何管理序列销毁的。无论哪种方式,最终都是调用dispose()方法来触发销毁的,那么dispose()做了什么呢?
一、如何释放资源
RxSwift中,序列的创建需要用create操作符,创建出来的序列需要用dispose()方法来销毁,销毁之后,序列中包含的事件就不会再发送,可以节省内存。例如:
let observable = Observable.create { (observer) -> Disposable in
observer.onNext("Hello, world!")
observer.onCompleted()
return Disposables.create()
}
observable.subscribe(
onNext: { element in
print(element)
},
onCompleted: {
print("Completed")
}
)
在上面的例子中,create操作符创建了一个序列,这个序列包含两个事件,一个onNext事件和一个onCompleted事件。subscribe方法订阅了这个序列,并将事件打印到控制台。当序列销毁后,序列中包含的事件就不会再发送了,因此控制台不会打印任何东西。
二、dispose()方法
dispose()方法是用来销毁序列的。它会调用序列的deinit方法,释放序列中包含的所有资源。例如:
class MyObservable: ObservableType {
typealias E = String
func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {
observer.on(.next("Hello, world!"))
observer.on(.completed)
return Disposables.create()
}
deinit {
print("MyObservable deinit")
}
}
let observable = MyObservable()
observable.subscribe(
onNext: { element in
print(element)
},
onCompleted: {
print("Completed")
}
)
在上面的例子中,MyObservable类是一个自定义的序列类型。它的subscribe方法创建了一个序列,这个序列包含两个事件,一个onNext事件和一个onCompleted事件。subscribe方法订阅了这个序列,并将事件打印到控制台。当序列销毁后,序列中的事件就不会再发送了,因此控制台不会打印任何东西。当序列销毁时,它的deinit方法也会被调用,打印"MyObservable deinit"。
三、dispose()的时机
dispose()方法应该在不再需要序列时调用。例如,当视图控制器销毁时,应该调用订阅序列的dispose()方法。这样可以防止内存泄漏。
四、小结
dispose()方法是用来销毁RxSwift序列的。它会调用序列的deinit方法,释放序列中包含的所有资源。dispose()方法应该在不再需要序列时调用,例如当视图控制器销毁时。