Skip to content

Instantly share code, notes, and snippets.

@danielt1263
Created December 20, 2018 14:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielt1263/bf24b3b59dd33fef4cfa568d0e47f91b to your computer and use it in GitHub Desktop.
Save danielt1263/bf24b3b59dd33fef4cfa568d0e47f91b to your computer and use it in GitHub Desktop.
//
// RxCache.swift
//
// Created by Daniel Tartaglia on 12/20/18.
// Copyright © 2018 Daniel Tartaglia. MIT License.
//
import RxSwift
final class Cache<Key: Hashable, State> {
init(qos: DispatchQoS, source: @escaping (Key) -> Single<State>) {
scheduler = SerialDispatchQueueScheduler(qos: qos)
getState = source
}
func data(for key: Key) -> Single<State> {
lock.lock(); defer { lock.unlock() }
guard let state = cache[key] else {
let state = ReplaySubject<State>.create(bufferSize: 1)
getState(key)
.observeOn(scheduler)
.subscribe(onSuccess: { state.onNext($0) })
.disposed(by: bag)
cache[key] = state
return state.asSingle()
}
return state.asSingle()
}
private var cache: [Key: ReplaySubject<State>] = [:]
private let scheduler: SerialDispatchQueueScheduler
private let lock = NSRecursiveLock()
private let getState: (Key) -> Single<State>
private let bag = DisposeBag()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment