RxSwift學(xué)習(xí)--核心邏輯再探

前言

通過上一篇內(nèi)容RxSwift學(xué)習(xí)--核心邏輯初探,對(duì)RxSwift有了些初步的認(rèn)知础废,下面通過源碼來看一下RxSwift到底有多騷

RxSwift核心邏輯再探

先把上篇中的例子代碼搬過來:

//第一步:創(chuàng)建序列
//在create()函數(shù)中傳入一個(gè)閉包史汗,任務(wù)是對(duì)每一個(gè)過來的訂閱進(jìn)行處理
 let ob = Observable<Any>.create { (observer) -> Disposable in
            // 第三步:發(fā)送信號(hào)(onCompleted和onError只能發(fā)送一個(gè))
            observer.onNext("你好騷啊")
            observer.onCompleted()
//            observer.onError(NSError.init(domain: "loser", code: 10010, userInfo: nil))
            return Disposables.create()
 
//第二步:訂閱信息
//當(dāng)我們訂閱了Observable的消息后浸剩,只要Observable的事件觸發(fā)肝匆,都會(huì)通過onNext這個(gè)閉包告訴我們味悄。
 let _ = ob.subscribe(onNext: { (text) in
            print("訂閱到:\(text)")    //這里會(huì)監(jiān)聽到訂閱的Observable事件
        }, onError: { (error) in
            print("error: \(error)")    //當(dāng)發(fā)生錯(cuò)誤時(shí)刻获,會(huì)回調(diào)這里
        }, onCompleted: { // 當(dāng)序列執(zhí)行完畢時(shí)郎仆,會(huì)回調(diào)這里只祠。
            print("完成")
        }) {
            print("銷毀") 
        }

下面我們根據(jù)代碼進(jìn)行具體分析:

1.創(chuàng)建序列Observable<Any>.create()

在執(zhí)行let ob = Observable<Any>.create { (obserber) -> Disposable in } 這句代碼時(shí),是創(chuàng)建了一個(gè)可觀察序列扰肌,點(diǎn)進(jìn)create()方法的源碼

extension ObservableType {
    /*
     Creates an observable sequence from a specified subscribe method implementation.
    
     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
    
     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
     - returns: The observable sequence with the specified implementation for the `subscribe` method.
     */

    public static func create(_ subscribe: @escaping (RxSwift.AnyObserver<Self.E>) -> Disposable) -> RxSwift.Observable<Self.E>
}

根據(jù)注釋路由可知create()方法是在Create.swift文件中實(shí)現(xiàn)的

public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {
    return AnonymousObservable(subscribe)
}

create()方法中返回了一個(gè)匿名內(nèi)部類---AnonymousObservable(匿名序列)抛寝,用來存儲(chǔ)產(chǎn)生事件的閉包(self._subscribeHandler = subscribeHandler)和激活處理事件閉包的入口(run方法)在跟進(jìn)去這個(gè)類,

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)
    }
}

可以看到在匿名序列的里面是把傳給create()方法的閉包(也就是序列訂閱的回調(diào),self._subscribeHandler = subscribeHandler)保存下來了

2.序列訂閱ob.subscribe(onNext:)

同樣的,跟進(jìn)去訂閱信號(hào)的這個(gè)方法的源碼盗舰,
在這里跟源碼晶府,跟進(jìn)去的是ObserveableType.subscribe這個(gè)方法

subscribe.png

public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
        -> Disposable {
            let disposable: Disposable
            
            if let disposed = onDisposed {
                disposable = Disposables.create(with: disposed)
            }
            else {
                disposable = Disposables.create()
            }
            
            #if DEBUG
                let synchronizationTracker = SynchronizationTracker()
            #endif
            
            let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []
            
            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()
                }
            }
            return Disposables.create(
                self.asObservable().subscribe(observer),
                disposable
            )
    }

可以看到在調(diào)用ob.subscribe()這個(gè)方法的時(shí)候,onNext, onError,onComplete, onDisposed這四個(gè)閉包都是作為參數(shù)傳遞到這個(gè)訂閱函數(shù)中來钻趋,
在這段代碼里同樣的也創(chuàng)建了一個(gè)匿名觀察者let observer = AnonymousObserver<E>用于存儲(chǔ)和處理事件的閉包川陆,而對(duì)于這個(gè)觀察者會(huì)傳入一個(gè)帶有event的閉包,在前面已經(jīng)知道event是一個(gè)枚舉類型爷绘,有三種事件類型.next书劝,.error,.completed,所以只要這個(gè)觀察者調(diào)用了這三種事件土至,那么相應(yīng)的就會(huì)調(diào)用onNext购对,onError,onCompleted這三個(gè)方法的具體實(shí)現(xiàn)陶因,可是這里的observer觀察者只是一個(gè)局部變量骡苞,它怎么和外界的觀察者聯(lián)系起來呢?

騷就騷在這個(gè)訂閱方法的return這句代碼:

return Disposables.create(
        self.asObservable().subscribe(observer),
        disposable
)

其實(shí)這個(gè)self.asObservable()就是我們?cè)谧铋_始定義的序列let ob = Observable<Any>,而subscribe()就是回調(diào)了我們剛剛創(chuàng)建的observer閉包楷扬,而observer就會(huì)調(diào)用傳入的監(jiān)聽序列消息閉包onNext, onError,onCompleted,
那么這個(gè)subscribe()是怎么回調(diào)了observer呢解幽?

可知self.asObservable()AnonymousObservable類型的,但是通過前面的AnonymousObservable類的源碼可以發(fā)現(xiàn)烘苹,它并沒有subscribe()這個(gè)方法躲株,但是AnonymousObservable是繼承于Producer(生產(chǎn)者)的,下面來看一下Producer這個(gè)類的源碼:

class Producer<Element> : Observable<Element> {
    override init() {
        super.init()
    }

    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {
        if !CurrentThreadScheduler.isScheduleRequired {
            // The returned disposable needs to release all references once it was disposed.
            let disposer = SinkDisposer()
            let sinkAndSubscription = self.run(observer, cancel: disposer)
            disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)

            return disposer
        }
        else {
            return CurrentThreadScheduler.instance.schedule(()) { _ in
                let disposer = SinkDisposer()
                let sinkAndSubscription = self.run(observer, cancel: disposer)
                disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)

                return disposer
            }
        }
    }

    func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
        rxAbstractMethod()
    }
}

在這里面subscribe()方法會(huì)把傳入的observer镣衡,調(diào)用self.run(observer, cancel: disposer);那么再次跟進(jìn)去看源碼霜定;至于這個(gè)run()方法具體怎么調(diào)用,應(yīng)該還是交給Producer的子類AnonymousObservable去實(shí)現(xiàn)的廊鸥,那么跟進(jìn)去望浩,代碼再次回到了AnonymousObservable類里面:

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)
    }

在這里會(huì)創(chuàng)建一個(gè)AnonymousObservableSink對(duì)象并持有observer,然后這個(gè)AnonymousObservableSink類會(huì)調(diào)用它自己的run()方法,并傳入self,再次跟進(jìn)去sink.run(self),發(fā)現(xiàn)來到了AnonymousObservableSink類的源碼;

final private class AnonymousObservableSink<O: ObserverType>: Sink<O>, ObserverType {
    typealias E = O.E
    typealias Parent = AnonymousObservable<E>

    // state
    private let _isStopped = AtomicInt(0)

    #if DEBUG
        fileprivate let _synchronizationTracker = SynchronizationTracker()
    #endif

    override init(observer: O, cancel: Cancelable) {
        super.init(observer: observer, cancel: cancel)
    }

    func on(_ event: Event<E>) {
        #if DEBUG
            self._synchronizationTracker.register(synchronizationErrorMessage: .default)
            defer { self._synchronizationTracker.unregister() }
        #endif
        switch event {
        case .next:
            if load(self._isStopped) == 1 {
                return
            }
            self.forwardOn(event)
        case .error, .completed:
            if fetchOr(self._isStopped, 1) == 0 {
                self.forwardOn(event)
                self.dispose()
            }
        }
    }

    func run(_ parent: Parent) -> Disposable {
        return parent._subscribeHandler(AnyObserver(self))
    }
}

可以看到AnonymousObservableSinkrun()方法惰说,返回parent._subscribeHandler(),而這個(gè)Parent,在這個(gè)AnonymousObservableSink類中已經(jīng)取了別名磨德,那就是typealias Parent = AnonymousObservable<E>;在前面我們已經(jīng)知道,AnonymousObservable匿名序列的里面是把傳給create()函數(shù)的閉包保存了下來吆视,那么return parent._subscribeHandler(AnyObserver(self))這個(gè)_subscribeHandler就是之前create()函數(shù)的閉包,在這個(gè)_subscribeHandler(AnyObserver(self))方法中把self轉(zhuǎn)換成AnyObserver對(duì)象典挑,也就是把AnonymousObservableSink對(duì)象轉(zhuǎn)換成AnyObserver對(duì)象.

現(xiàn)在接著來看AnyObserver的源碼:

public struct AnyObserver<Element> : ObserverType {
    /// The type of elements in sequence that observer can observe.
    public typealias E = Element
    
    /// Anonymous event handler type.
    public typealias EventHandler = (Event<Element>) -> Void

    private let observer: EventHandler

    /// Construct an instance whose `on(event)` calls `eventHandler(event)`
    ///
    /// - parameter eventHandler: Event handler that observes sequences events.
    public init(eventHandler: @escaping EventHandler) {
        self.observer = eventHandler
    }
    
    /// Construct an instance whose `on(event)` calls `observer.on(event)`
    ///
    /// - parameter observer: Observer that receives sequence events.
    public init<O : ObserverType>(_ observer: O) where O.E == Element {
        self.observer = observer.on
    }
    
    /// Send `event` to this observer.
    ///
    /// - parameter event: Event instance.
    public func on(_ event: Event<Element>) {
        return self.observer(event)
    }

    /// Erases type of observer and returns canonical observer.
    ///
    /// - returns: type erased observer.
    public func asObserver() -> AnyObserver<E> {
        return self
    }
}

通過剛剛的AnyObserver(self)我們應(yīng)該知道這里的self指的是AnonymousObservableSink,所以在AnyObserver的源碼中,可以看到在構(gòu)造函數(shù)中有一行代碼self.observer = observer.on,就是把AnonymousObservableSink類的on函數(shù)賦值給AnyObserverobserver變量.注意這里保存的是AnonymousObservableSink.on.

看到這里是否能明白啦吧,在調(diào)用ob.subscribe方法的時(shí)候搔弄,創(chuàng)建了一個(gè)AnonymousObserver對(duì)象,并把閉包傳入丰滑,但是這個(gè)對(duì)象最終走向的卻是繼承于ProducerAnonymousObservable類的subscribe()方法,經(jīng)過調(diào)用self.run()之后,最后返回AnonymousObservable._subscribeHandler()方法,也就是ob.create()方法褒墨。這部分代碼先分析到這里炫刷,下面來分析下發(fā)送信號(hào)的代碼。

3.發(fā)送信號(hào)observer.onNext("你好騷啊")

在剛開始分析create()方法的時(shí)候郁妈,就已經(jīng)知道浑玛,observer.onNext("你好騷啊")中的observerAnyObserver類型的,可是在上面的AnyObserver源碼中我們可以清楚地看到它并沒有onNext()方法噩咪,那就去它的父類ObserverType看一下顾彰,

extension ObserverType {
    
    /// Convenience method equivalent to `on(.next(element: E))`
    ///
    /// - parameter element: Next element to send to observer(s)
    public func onNext(_ element: E) {
        self.on(.next(element))
    }
    
    /// Convenience method equivalent to `on(.completed)`
    public func onCompleted() {
        self.on(.completed)
    }
    
    /// Convenience method equivalent to `on(.error(Swift.Error))`
    /// - parameter error: Swift.Error to send to observer(s)
    public func onError(_ error: Swift.Error) {
        self.on(.error(error))
    }
}

在這里可以看到調(diào)用ObserverTypeonNext方法,返回ObserverTypeon(.next(element)),所以在observer.onNext("你好騷啊")調(diào)用onNext()方法胃碾,其實(shí)調(diào)用的就是observer.on(.next()),在前面的AnyObserver的源碼中涨享,已經(jīng)知道AnyObserverobserver變量保存的是AnonymousObservableSink.on,同樣的看一下在AnyObserver的源碼中的on()方法

public func on(_ event: Event<Element>) {
        return self.observer(event)
    }

這里返回的是self.observer(event),也就是說observer.on(.next())可以是self.observer(.next())仆百,然而self.observer = AnonymousObservableSink.on,所以self.observer(.next())可以是AnonymousObservableSink.on(.next()),這里又回到了AnonymousObservableSink這個(gè)類了厕隧,(AnonymousObservableSink的源碼在前面已經(jīng)出現(xiàn)了)這是饒了一圈又回來了,下面把AnonymousObservableSinkon(event)方法單獨(dú)拿出來:

func on(_ event: Event<E>) {
        #if DEBUG
            self._synchronizationTracker.register(synchronizationErrorMessage: .default)
            defer { self._synchronizationTracker.unregister() }
        #endif
        switch event {
        case .next:
            if load(self._isStopped) == 1 {
                return
            }
            self.forwardOn(event)
        case .error, .completed:
            if fetchOr(self._isStopped, 1) == 0 {
                self.forwardOn(event)
                self.dispose()
            }
        }
    }

on(event)方法中有句重要的代碼self.forwardOn(event),再跟進(jìn)去self.forwardOn(event)這個(gè)方法俄周,可以看到進(jìn)入到Sink類的方法中吁讨,這里AnonymousObservableSink繼承于Sink

 final func forwardOn(_ event: Event<O.E>) {
        #if DEBUG
            self._synchronizationTracker.register(synchronizationErrorMessage: .default)
            defer { self._synchronizationTracker.unregister() }
        #endif
        if isFlagSet(self._disposed, 1) {
            return
        }
        self._observer.on(event)
    }

在這個(gè)方法中self._observer.on(event)代碼中,這個(gè)self._observer就是在初始化AnonymousObservableSink時(shí)候傳入的observer(
let sink = AnonymousObservableSink(observer: observer, cancel: cancel))峦朗,然而這個(gè)observer是在subscribe()訂閱方法中由let observer = AnonymousObserver創(chuàng)建的observer,那么等于是這里又來到了AnonymousObserver中,那么下面就來看一下調(diào)用AnonymousObserver.on(event)會(huì)發(fā)生什么建丧,現(xiàn)在來看一下AnonymousObserver的源碼:

final class AnonymousObserver<ElementType> : ObserverBase<ElementType> {
    typealias Element = ElementType
    
    typealias EventHandler = (Event<Element>) -> Void
    
    private let _eventHandler : EventHandler
    
    init(_ eventHandler: @escaping EventHandler) {
#if TRACE_RESOURCES
        _ = Resources.incrementTotal()
#endif
        self._eventHandler = eventHandler
    }

    override func onCore(_ event: Event<Element>) {
        return self._eventHandler(event)
    }
    
#if TRACE_RESOURCES
    deinit {
        _ = Resources.decrementTotal()
    }
#endif
}

通過這里的源碼可以看到AnonymousObserver類中并沒有on方法,但是AnonymousObserver是繼承于ObserverBase的波势,在ObserverBase的源碼中我們可以看到:

class ObserverBase<ElementType> : Disposable, ObserverType {
    typealias E = ElementType

    private let _isStopped = AtomicInt(0)

    func on(_ event: Event<E>) {
        switch event {
        case .next:
            if load(self._isStopped) == 0 {
                self.onCore(event)
            }
        case .error, .completed:
            if fetchOr(self._isStopped, 1) == 0 {
                self.onCore(event)
            }
        }
    }

    func onCore(_ event: Event<E>) {
        rxAbstractMethod()
    }

    func dispose() {
        fetchOr(self._isStopped, 1)
    }
}

調(diào)用ObserverBaseon()方法會(huì)返回self.onCore(event);這里回到子類AnonymousObserver去執(zhí)行這個(gè)方法翎朱;

 override func onCore(_ event: Event<Element>) {
        return self._eventHandler(event)
    }

可以看到這里返回的是self._eventHandler(event);也就是AnonymousObserver._eventHandler(event)通過源碼可知這里的AnonymousObserver._eventHandler(event)就是傳入的eventHandler(event),也就是序列訂閱方法ob.subscribe()傳入的閉包,那么就來看下在subscribe()訂閱方法中AnonymousObserver創(chuàng)建的observer到底對(duì)這個(gè)eventHandler(event)做了什么事情:


            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()
                }
            }

因?yàn)?code>Event是枚舉值這里會(huì)根據(jù)observer傳入的event來判斷到底該響應(yīng)onNext(),onError(),onCompleted()的具體方法艰亮,這樣就是把create()方法中的observer.onNext("你好騷啊")subscribe()訂閱方法中onNext()聯(lián)系起來了闭翩。這樣就說明了為什么觀察者調(diào)用了onNext()方法,序列能夠訂閱到這個(gè)方法里的內(nèi)容迄埃。

總結(jié)

啰啰嗦嗦寫了這么多疗韵,算是對(duì)RxSwift的核心邏輯有了個(gè)初步的認(rèn)識(shí),不等不說RxSwift很強(qiáng)大侄非,足夠的"騷氣"蕉汪。目前寫到這里,對(duì)RxSwift僅僅只是略知皮毛逞怨,冰山一角罷了者疤,對(duì)RxSwift的學(xué)習(xí)還需要繼續(xù)努力。下面通過一張圖來總結(jié)一下:

RxSwift核心邏輯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叠赦,一起剝皮案震驚了整個(gè)濱河市驹马,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖糯累,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件算利,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泳姐,警方通過查閱死者的電腦和手機(jī)效拭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胖秒,“玉大人缎患,你說我怎么就攤上這事⊙指危” “怎么了挤渔?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盗痒。 經(jīng)常有香客問我蚂蕴,道長(zhǎng),這世上最難降的妖魔是什么俯邓? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任骡楼,我火速辦了婚禮,結(jié)果婚禮上稽鞭,老公的妹妹穿的比我還像新娘鸟整。我一直安慰自己,他們只是感情好朦蕴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布篮条。 她就那樣靜靜地躺著,像睡著了一般吩抓。 火紅的嫁衣襯著肌膚如雪涉茧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天疹娶,我揣著相機(jī)與錄音伴栓,去河邊找鬼。 笑死雨饺,一個(gè)胖子當(dāng)著我的面吹牛钳垮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播额港,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饺窿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了移斩?” 一聲冷哼從身側(cè)響起肚医,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绢馍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肠套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痕貌,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年糠排,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超升。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡入宦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出室琢,到底是詐尸還是另有隱情乾闰,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布盈滴,位于F島的核電站涯肩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巢钓。R本人自食惡果不足惜病苗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症汹。 院中可真熱鬧硫朦,春花似錦、人聲如沸背镇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞒斩。三九已至破婆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胸囱,已是汗流浹背祷舀。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺矾,地道東北人蔑鹦。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箕宙,于是被迫代替她去往敵國(guó)和親嚎朽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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