Skip to content

Commit cf81739

Browse files
committed
Use StoreObservable protocol with protocol extension
1 parent a73bec5 commit cf81739

File tree

5 files changed

+39
-58
lines changed

5 files changed

+39
-58
lines changed

Cache.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@
138138
D5A9D1B721134547005DBD3F /* ObservationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1B621134547005DBD3F /* ObservationToken.swift */; };
139139
D5A9D1B821134547005DBD3F /* ObservationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1B621134547005DBD3F /* ObservationToken.swift */; };
140140
D5A9D1B921134547005DBD3F /* ObservationToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1B621134547005DBD3F /* ObservationToken.swift */; };
141-
D5A9D1BB211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BA211345D4005DBD3F /* Dictionary+Extensions.swift */; };
142-
D5A9D1BC211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BA211345D4005DBD3F /* Dictionary+Extensions.swift */; };
143-
D5A9D1BD211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BA211345D4005DBD3F /* Dictionary+Extensions.swift */; };
144141
D5A9D1BF21134776005DBD3F /* StoreChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BE21134776005DBD3F /* StoreChange.swift */; };
145142
D5A9D1C021134776005DBD3F /* StoreChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BE21134776005DBD3F /* StoreChange.swift */; };
146143
D5A9D1C121134776005DBD3F /* StoreChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1BE21134776005DBD3F /* StoreChange.swift */; };
144+
D5A9D1C321144B65005DBD3F /* StoreObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1C221144B65005DBD3F /* StoreObservable.swift */; };
145+
D5A9D1C421144B65005DBD3F /* StoreObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1C221144B65005DBD3F /* StoreObservable.swift */; };
146+
D5A9D1C521144B65005DBD3F /* StoreObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A9D1C221144B65005DBD3F /* StoreObservable.swift */; };
147147
/* End PBXBuildFile section */
148148

149149
/* Begin PBXContainerItemProxy section */
@@ -232,8 +232,8 @@
232232
D5A138C01EB29BFA00881A20 /* UIImage+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extensions.swift"; sourceTree = "<group>"; };
233233
D5A138C31EB29C2100881A20 /* NSImage+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSImage+Extensions.swift"; sourceTree = "<group>"; };
234234
D5A9D1B621134547005DBD3F /* ObservationToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObservationToken.swift; sourceTree = "<group>"; };
235-
D5A9D1BA211345D4005DBD3F /* Dictionary+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+Extensions.swift"; sourceTree = "<group>"; };
236235
D5A9D1BE21134776005DBD3F /* StoreChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreChange.swift; sourceTree = "<group>"; };
236+
D5A9D1C221144B65005DBD3F /* StoreObservable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreObservable.swift; sourceTree = "<group>"; };
237237
D5DC59E01C20593E003BD79B /* Cache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Cache.framework; sourceTree = BUILT_PRODUCTS_DIR; };
238238
EBAACA991FBC369300FA206E /* SimpleStorage.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = SimpleStorage.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
239239
/* End PBXFileReference section */
@@ -322,7 +322,6 @@
322322
children = (
323323
D28897041F8B79B300C61DEE /* JSONDecoder+Extensions.swift */,
324324
D2CF98501F694FFA00CE8F68 /* Date+Extensions.swift */,
325-
D5A9D1BA211345D4005DBD3F /* Dictionary+Extensions.swift */,
326325
);
327326
path = Extensions;
328327
sourceTree = "<group>";
@@ -363,6 +362,7 @@
363362
D270148320D10E76003B45C7 /* AsyncStorage.swift */,
364363
D270148720D11040003B45C7 /* Storage+Transform.swift */,
365364
D5A9D1BE21134776005DBD3F /* StoreChange.swift */,
365+
D5A9D1C221144B65005DBD3F /* StoreObservable.swift */,
366366
);
367367
path = Storage;
368368
sourceTree = "<group>";
@@ -809,6 +809,7 @@
809809
files = (
810810
D221E5C620D00DDB00BC940E /* DiskStorage.swift in Sources */,
811811
D21B669D1F6A724600125DE1 /* DiskConfig.swift in Sources */,
812+
D5A9D1C521144B65005DBD3F /* StoreObservable.swift in Sources */,
812813
D21B66871F6A723C00125DE1 /* ExpirationMode.swift in Sources */,
813814
D21B66881F6A723C00125DE1 /* Expiry.swift in Sources */,
814815
D270147620D101F3003B45C7 /* StorageAware.swift in Sources */,
@@ -821,7 +822,6 @@
821822
D270147220D1018A003B45C7 /* Transformer.swift in Sources */,
822823
D21B668C1F6A723C00125DE1 /* Types.swift in Sources */,
823824
D2D4CC261FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */,
824-
D5A9D1BD211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */,
825825
D27014A720D129EB003B45C7 /* TransformerFactory.swift in Sources */,
826826
D270147E20D107DA003B45C7 /* SyncStorage.swift in Sources */,
827827
D292DAFF1F6A970B0060F614 /* Result.swift in Sources */,
@@ -893,6 +893,7 @@
893893
files = (
894894
D221E5C520D00DDB00BC940E /* DiskStorage.swift in Sources */,
895895
D21B669B1F6A724600125DE1 /* DiskConfig.swift in Sources */,
896+
D5A9D1C421144B65005DBD3F /* StoreObservable.swift in Sources */,
896897
D21B667E1F6A723C00125DE1 /* ExpirationMode.swift in Sources */,
897898
D21B667F1F6A723C00125DE1 /* Expiry.swift in Sources */,
898899
D270147520D101F3003B45C7 /* StorageAware.swift in Sources */,
@@ -905,7 +906,6 @@
905906
D270147120D1018A003B45C7 /* Transformer.swift in Sources */,
906907
D21B66831F6A723C00125DE1 /* Types.swift in Sources */,
907908
D2D4CC251FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */,
908-
D5A9D1BC211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */,
909909
D27014A620D129EB003B45C7 /* TransformerFactory.swift in Sources */,
910910
D270147D20D107DA003B45C7 /* SyncStorage.swift in Sources */,
911911
D292DAFE1F6A970B0060F614 /* Result.swift in Sources */,
@@ -946,6 +946,7 @@
946946
files = (
947947
D221E5C420D00DDB00BC940E /* DiskStorage.swift in Sources */,
948948
D2CF98681F694FFA00CE8F68 /* ImageWrapper.swift in Sources */,
949+
D5A9D1C321144B65005DBD3F /* StoreObservable.swift in Sources */,
949950
D2CF98871F695B8F00CE8F68 /* Types.swift in Sources */,
950951
D2CF98621F694FFA00CE8F68 /* Date+Extensions.swift in Sources */,
951952
D2CF98641F694FFA00CE8F68 /* DataSerializer.swift in Sources */,
@@ -958,7 +959,6 @@
958959
D2CF98601F694FFA00CE8F68 /* DiskConfig.swift in Sources */,
959960
D270147020D1018A003B45C7 /* Transformer.swift in Sources */,
960961
D292DAFD1F6A970B0060F614 /* Result.swift in Sources */,
961-
D5A9D1BB211345D4005DBD3F /* Dictionary+Extensions.swift in Sources */,
962962
D27014A520D129EB003B45C7 /* TransformerFactory.swift in Sources */,
963963
D2D4CC241FA3426B00E4A2D5 /* JSONArrayWrapper.swift in Sources */,
964964
D270147C20D107DA003B45C7 /* SyncStorage.swift in Sources */,

Source/Shared/Extensions/Dictionary+Extensions.swift

Lines changed: 0 additions & 9 deletions
This file was deleted.

Source/Shared/Storage/HybridStorage.swift

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import Foundation
22

33
/// Use both memory and disk storage. Try on memory first.
4-
public class HybridStorage<T> {
4+
public final class HybridStorage<T>: StoreObservable {
55
public let memoryStorage: MemoryStorage<T>
66
public let diskStorage: DiskStorage<T>
77

8-
private var observations = [UUID : (HybridStorage, StoreChange) -> Void]()
8+
var observations = [UUID : (HybridStorage<T>, StoreChange) -> Void]()
99

1010
public init(memoryStorage: MemoryStorage<T>, diskStorage: DiskStorage<T>) {
1111
self.memoryStorage = memoryStorage
@@ -60,25 +60,3 @@ public extension HybridStorage {
6060
return storage
6161
}
6262
}
63-
64-
// MARK: - Observations
65-
66-
extension HybridStorage {
67-
@discardableResult
68-
func observeChanges(using closure: @escaping (HybridStorage, StoreChange) -> Void) -> ObservationToken {
69-
let id = observations.insert(closure)
70-
71-
return ObservationToken { [weak self] in
72-
self?.observations.removeValue(forKey: id)
73-
}
74-
}
75-
76-
private func notifyObservers(of change: StoreChange) {
77-
observations.values.forEach { [weak self] closure in
78-
guard let strongSelf = self else {
79-
return
80-
}
81-
closure(strongSelf, change)
82-
}
83-
}
84-
}

Source/Shared/Storage/Storage.swift

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,12 @@ import Dispatch
33

44
/// Manage storage. Use memory storage if specified.
55
/// Synchronous by default. Use `async` for asynchronous operations.
6-
public class Storage<T> {
6+
public final class Storage<T>: StoreObservable {
77
/// Used for sync operations
88
let syncStorage: SyncStorage<T>
99
let asyncStorage: AsyncStorage<T>
1010

11-
private var observations = [UUID : (Storage, StoreChange) -> Void]()
12-
13-
@discardableResult
14-
func observeChanges(using closure: @escaping (Storage, StoreChange) -> Void) -> ObservationToken {
15-
let id = observations.insert(closure)
16-
17-
return ObservationToken { [weak self] in
18-
self?.observations.removeValue(forKey: id)
19-
}
20-
}
11+
var observations = [UUID : (Storage, StoreChange) -> Void]()
2112

2213
/// Initialize storage with configuration options.
2314
///
@@ -64,12 +55,7 @@ public class Storage<T> {
6455

6556
private func subscribeToChanges(in storage: HybridStorage<T>) {
6657
storage.observeChanges { [weak self] _, change in
67-
self?.observations.values.forEach { [weak self] closure in
68-
guard let strongSelf = self else {
69-
return
70-
}
71-
closure(strongSelf, change)
72-
}
58+
self?.notifyObservers(of: change)
7359
}
7460
}
7561
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Foundation
2+
3+
protocol StoreObservable: class {
4+
var observations: [UUID : (Self, StoreChange) -> Void] { get set }
5+
}
6+
7+
extension StoreObservable {
8+
@discardableResult
9+
public func observeChanges(using closure: @escaping (Self, StoreChange) -> Void) -> ObservationToken {
10+
let id = UUID()
11+
observations[id] = closure
12+
13+
return ObservationToken { [weak self] in
14+
self?.observations.removeValue(forKey: id)
15+
}
16+
}
17+
18+
func notifyObservers(of change: StoreChange) {
19+
observations.values.forEach { [weak self] closure in
20+
guard let strongSelf = self else {
21+
return
22+
}
23+
closure(strongSelf, change)
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)