RXSwift的最初探索
iOS 中 我們常用到的函數(shù)式編程 oc中的RAC 和 swift中的RXSwift 是非常有影響力的伪嫁,最近也是嘗試著查看RXSwift的相關(guān)信息相赁,今天就從rxswif 入手:
rxswift 的使用方式
例如 我們常見使用的觀察者模式:在swift 中的使用方式是:
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
//然后 實(shí)現(xiàn)代理
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("響應(yīng)")
print(change as Any)
}
deinit {
self.removeObserver(self.person, forKeyPath: "name", context: nil)
}
這樣去執(zhí)行 并且去觀察 對(duì)象的輸出變化
但是在rxswift 中 的代碼塊是這樣子的
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value as Any)
})
.disposed(by: disposeBag)
這樣 能實(shí)現(xiàn)以上觀察者模式相同的代碼內(nèi)容,完成業(yè)務(wù)需求庆猫。同理,我們可以執(zhí)行一些其他的對(duì)象rx的使用方式:
// UItextFiled:
self.textFiled.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text)
})
.disposed(by: disposeBag)
//UIButton:的使用方式
self.button.rx.tap
.subscribe(onNext: { () in
print("點(diǎn)擊來了")
})
.disposed(by: disposeBag)
//
此時(shí),會(huì)有疑惑拷邢,為什么多個(gè)對(duì)象都是擁有rx這個(gè)屬性的。 這個(gè)就需要進(jìn)入到rx 的里面去查詢
以button為例子:
associatedtype CompatibleType
/// Reactive extensions.
static var rx: Reactive<CompatibleType>.Type { get set }
/// Reactive extensions.
var rx: Reactive<CompatibleType> { get set }
associatedtype 拓展
定義一個(gè)協(xié)議時(shí)屎慢,有的時(shí)候聲明一個(gè)或多個(gè)關(guān)聯(lián)類型作為協(xié)議定義的一部分將會(huì)非常有用瞭稼。關(guān)聯(lián)類型為協(xié)議中的某個(gè)類型提供了一個(gè)占位名(或者說別名),其代表的實(shí)際類型在協(xié)議被采納時(shí)才會(huì)被指定腻惠。
在這里环肘,因?yàn)樽髡唛_發(fā)大多是用于oc 對(duì)iOS APP的開發(fā),對(duì)于oc開發(fā)者來說集灌,associatedtype類似于擴(kuò)展和類別悔雹,實(shí)現(xiàn)這個(gè)的方法。 ok 我們繼續(xù)下去
在所有的對(duì)象文件rx 文件中欣喧,我們能看到public protocol ReactiveCompatible,那么 我們就能能理解為腌零,rxswift 在對(duì)每個(gè)對(duì)象,做到了協(xié)議 然后關(guān)聯(lián)到了對(duì)象上面唆阿,那么rxswift 是怎么去關(guān)聯(lián)的呢益涧?
extension NSObject: ReactiveCompatible { }
//萬物皆對(duì)象啊 兄弟們 /// 打個(gè)666
然后講講Observable
let ob = Observable<Any>.create { (obserber) -> Disposable in
發(fā)送信號(hào)
obserber.onNext("")
obserber.onCompleted()
obserber.onError(NSError.init(domain: "error info ", code: 8888, userInfo: nil))
return Disposables.create()
}
這個(gè)地方是對(duì)創(chuàng)建的信號(hào)序列 的創(chuàng)建 以及信息的發(fā)送,
let _ = ob.subscribe(onNext: { (text) in
print("\(text)")
}, onError: { (error) in
print("error: \(error)")
}, onCompleted: {
print("完成")
}) {
print("銷毀")
}
這里 是對(duì)信息的接收 那么 rx 內(nèi)部的實(shí)現(xiàn) 就是對(duì)序列 信號(hào)的響應(yīng)
在這里 可以思考下 為什么 UI層能夠被rx 所捕捉到呢驯鳖?
思考:
@available(iOS 2.0, *)
open class UIControl : UIView {
// add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
// passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order
// the action cannot be NULL. Note that the target is not retained.
open func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event)
點(diǎn)擊controller 不難發(fā)現(xiàn) 我們看到了 addTarget
在此 是否可以理解為 rx內(nèi)部的實(shí)現(xiàn) 是否是有對(duì)addTarget的監(jiān)聽 然后 通過selector 去執(zhí)行了onNext 方法發(fā)送信號(hào)呢闲询?
繼續(xù)...
public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
return AnonymousObservable(subscribe)
}
返回一個(gè)匿名的內(nèi)部類
final private class AnonymousObservable<Element>: Producer<Element> {
typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable
let _subscribeHandler: SubscribeHandler
init(_ subscribeHandler: @escaping SubscribeHandler) {
self._subscribeHandler = subscribeHandler
}
override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
let subscription = sink.run(self)
return (sink: sink, subscription: subscription)
}
}
這個(gè)匿名函數(shù)是繼承于Producer 的 并且 typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable
let _subscribeHandler: SubscribeHandle
對(duì)這個(gè)閉包 做了保存處理
那么 繼續(xù)看subscribe
內(nèi)容里面 我們看到
let observer = AnonymousObserver<E>
是對(duì)observer 的初始化,但是并沒有對(duì)應(yīng)上Observable的obserber
點(diǎn)擊asObservable() 發(fā)現(xiàn)返回的就是ob對(duì)象臼隔,并且 我們從Observable 中 并沒有發(fā)現(xiàn)subscribe 的方法嘹裂,那么繼續(xù) 我們根據(jù)之前的AnonymousObservable 這個(gè)匿名函數(shù) 點(diǎn)擊進(jìn)去發(fā)現(xiàn)了 繼承與Producer
在點(diǎn)擊進(jìn)去之后 有個(gè) override func subscribe 的方法,這個(gè)里面
let sinkAndSubscription = self.run(observer, cancel: disposer)
disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
func run(_ parent: Parent) -> Disposable {
return parent._subscribeHandler(AnyObserver(self))
}
是將這個(gè)交給了子類去實(shí)現(xiàn) run 方法
然后子類實(shí)現(xiàn)就是把之前保存的
typealias Parent = AnonymousObservable<E> parent._subscribeHandler(AnyObserver(self))
當(dāng)前保存的閉包 提交了出去 摔握,那么 看到的
return Disposables.create(
self.asObservable().subscribe(observer),
disposable
)
將我們之前ob 創(chuàng)建的對(duì)象內(nèi)容提交到了 subscribe
也就是說 obserber.onNext("我就玩玩")
發(fā)送后 subscribe里面的
let observer = AnonymousObserver<E> { event in
#if DEBUG
synchronizationTracker.register(synchronizationErrorMessage: .default)
defer { synchronizationTracker.unregister() }
#endif
switch event {
case .next(let value):
onNext?(value)
case .error(let error):
if let onError = onError {
onError(error)
}
else {
Hooks.defaultErrorHandler(callStack, error)
}
disposable.dispose()
case .completed:
onCompleted?()
disposable.dispose()
}
}
就捕捉到了信號(hào) 然后根據(jù)閉包 返回到了 我們所需要的onnet 接收器內(nèi)
目前 這就是我所理解的信號(hào) 0點(diǎn)了 睡覺 有問題的 大家?guī)臀艺蚁?我好糾正我的觀點(diǎn)