SyncStorage.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import Foundation
  2. import Dispatch
  3. /// Manipulate storage in a "all sync" manner.
  4. /// Block the current queue until the operation completes.
  5. public class SyncStorage<T> {
  6. public let innerStorage: HybridStorage<T>
  7. public let serialQueue: DispatchQueue
  8. public init(storage: HybridStorage<T>, serialQueue: DispatchQueue) {
  9. self.innerStorage = storage
  10. self.serialQueue = serialQueue
  11. }
  12. }
  13. extension SyncStorage: StorageAware {
  14. public func entry(forKey key: String) throws -> Entry<T> {
  15. var entry: Entry<T>!
  16. try serialQueue.sync {
  17. entry = try innerStorage.entry(forKey: key)
  18. }
  19. return entry
  20. }
  21. public func removeObject(forKey key: String) throws {
  22. try serialQueue.sync {
  23. try self.innerStorage.removeObject(forKey: key)
  24. }
  25. }
  26. public func setObject(_ object: T, forKey key: String, expiry: Expiry? = nil) throws {
  27. try serialQueue.sync {
  28. try innerStorage.setObject(object, forKey: key, expiry: expiry)
  29. }
  30. }
  31. public func removeAll() throws {
  32. try serialQueue.sync {
  33. try innerStorage.removeAll()
  34. }
  35. }
  36. public func removeExpiredObjects() throws {
  37. try serialQueue.sync {
  38. try innerStorage.removeExpiredObjects()
  39. }
  40. }
  41. }
  42. public extension SyncStorage {
  43. func transform<U>(transformer: Transformer<U>) -> SyncStorage<U> {
  44. let storage = SyncStorage<U>(
  45. storage: innerStorage.transform(transformer: transformer),
  46. serialQueue: serialQueue
  47. )
  48. return storage
  49. }
  50. }