@@ -5,8 +5,9 @@ import Dispatch
55/// Synchronous by default. Use `async` for asynchronous operations.
66public final class Storage < T> {
77 /// Used for sync operations
8- let syncStorage : SyncStorage < T >
9- let asyncStorage : AsyncStorage < T >
8+ private let syncStorage : SyncStorage < T >
9+ private let asyncStorage : AsyncStorage < T >
10+ private let hybridStorage : HybridStorage < T >
1011
1112 public let storageObservationRegistry = StorageObservationRegistry < Storage > ( )
1213 public let keyObservationRegistry = KeyObservationRegistry < Storage > ( )
@@ -20,45 +21,41 @@ public final class Storage<T> {
2021 public convenience init ( diskConfig: DiskConfig , memoryConfig: MemoryConfig , transformer: Transformer < T > ) throws {
2122 let disk = try DiskStorage ( config: diskConfig, transformer: transformer)
2223 let memory = MemoryStorage < T > ( config: memoryConfig)
23-
2424 let hybridStorage = HybridStorage ( memoryStorage: memory, diskStorage: disk)
25- let syncStorage = SyncStorage (
26- storage: hybridStorage,
27- serialQueue: DispatchQueue ( label: " Cache.SyncStorage.SerialQueue " )
28- )
29- let asyncStorage = AsyncStorage (
30- storage: hybridStorage,
31- serialQueue: DispatchQueue ( label: " Cache.AsyncStorage.SerialQueue " )
32- )
33-
34- self . init ( syncStorage: syncStorage, asyncStorage: asyncStorage)
25+ self . init ( hybridStorage: hybridStorage)
3526 }
3627
3728 /// Initialise with sync and async storages
3829 ///
3930 /// - Parameter syncStorage: Synchronous storage
4031 /// - Paraeter: asyncStorage: Asynchronous storage
41- public required init ( syncStorage: SyncStorage < T > , asyncStorage: AsyncStorage < T > ) {
42- self . syncStorage = syncStorage
43- self . asyncStorage = asyncStorage
44- subscribeToChanges ( )
32+ public init ( hybridStorage: HybridStorage < T > ) {
33+ self . hybridStorage = hybridStorage
34+ self . syncStorage = SyncStorage (
35+ storage: hybridStorage,
36+ serialQueue: DispatchQueue ( label: " Cache.SyncStorage.SerialQueue " )
37+ )
38+ self . asyncStorage = AsyncStorage (
39+ storage: hybridStorage,
40+ serialQueue: DispatchQueue ( label: " Cache.AsyncStorage.SerialQueue " )
41+ )
42+ subscribeToChanges ( in: hybridStorage)
4543 }
4644
4745 /// Used for async operations
4846 public lazy var async = self . asyncStorage
4947
50- private func subscribeToChanges( ) {
51- subscribeToChanges ( in: syncStorage. innerStorage)
52- if syncStorage. innerStorage !== asyncStorage. innerStorage {
53- subscribeToChanges ( in: asyncStorage. innerStorage)
54- }
55- }
56-
5748 private func subscribeToChanges( in storage: HybridStorage < T > ) {
5849 storage. storageObservationRegistry. addObservation { [ weak self] _, change in
5950 guard let strongSelf = self else { return }
6051 strongSelf. storageObservationRegistry. notifyObservers ( about: change, in: strongSelf)
6152 }
53+ keyObservationRegistry. onNewKey = { [ weak self] key in
54+ guard let strongSelf = self else { return }
55+ storage. keyObservationRegistry. addObservation ( { _, change in
56+ strongSelf. keyObservationRegistry. notifyObserver ( forKey: key, about: change, in: strongSelf)
57+ } , forKey: key)
58+ }
6259 }
6360}
6461
@@ -86,10 +83,6 @@ extension Storage: StorageAware {
8683
8784public extension Storage {
8885 func transform< U> ( transformer: Transformer < U > ) -> Storage < U > {
89- let storage = Storage < U > (
90- syncStorage: syncStorage. transform ( transformer: transformer) ,
91- asyncStorage: asyncStorage. transform ( transformer: transformer)
92- )
93- return storage
86+ return Storage < U > ( hybridStorage: hybridStorage. transform ( transformer: transformer) )
9487 }
9588}
0 commit comments