swift RxSwift:Observableを序列で同期处理に変更するref:https://qiita.com/hikarin522/items/187d48b25d9367170a51

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift RxSwift:Observableを序列で同期处理に変更するref:https://qiita.com/hikarin522/items/187d48b25d9367170a51相关的知识,希望对你有一定的参考价值。

class SyncFIFO<T> {
    var buf = Array<T>()
    let lock = DispatchSemaphore(value: 1)
    let sem = DispatchSemaphore(value: 0)

    func push(_ val: T) {
        self.lock.wait()
        defer { self.lock.signal() }
        self.buf.append(val)
        self.sem.signal()
    }

    func popSync() -> T {
        sem.wait()
        lock.wait()
        defer { lock.signal() }
        return buf.removeFirst()
    }
}

extension ObservableType {
    func toSequenceSync<T>() -> AnySequence<Event<T>> where T == E {
        return AnySequence { () -> AnyIterator<Event<T>> in
            let buf = SyncFIFO<Event<T>?>()
            let disposable = self.subscribe(buf.push)
            return AnyIterator {
                guard let ev = buf.popSync() else {
                    disposable.dispose()
                    return nil
                }

                switch ev {
                case .error, .completed:
                    buf.push(nil)
                    fallthrough
                case .next:
                    return ev
                }
            }
        }
    }
}

以上是关于swift RxSwift:Observableを序列で同期处理に変更するref:https://qiita.com/hikarin522/items/187d48b25d9367170a51的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift

RxSwift:延迟 observable 直到另一个 observable 完成?

重试延迟 - RxSwift

RxSwift - 一个 Observable 中的多个 Observable 值

Observable 的 RxSwift 用途

如何在 Observable.create (RxSwift) 中返回/转发一个 observable