Skip to content

Commit 4e5f9ca

Browse files
authored
Update Sink (VergeGroup#5)
1 parent 110e091 commit 4e5f9ca

File tree

4 files changed

+67
-18
lines changed

4 files changed

+67
-18
lines changed

Package.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import PackageDescription
55

66
let package = Package(
77
name: "UserDefaultsSnapshotLib",
8-
platforms: [.iOS(.v12)],
8+
platforms: [.iOS(.v13), .macOS(.v10_15)],
99
products: [
1010
// Products define the executables and libraries a package produces, and make them visible to other packages.
1111
.library(

Sources/UserDefaultsSnapshotLib/UserDefaultsPersistentStore.swift

+38-8
Original file line numberDiff line numberDiff line change
@@ -55,32 +55,62 @@ open class UserDefaultsPersistentStore<Schema: UserDefaultsObject>: UserDefaults
5555
}
5656
}
5757

58-
public final func sinkSnapshot(_ sink: @escaping (UserDefaultsSnapshot<Schema>) -> Void) -> UserDefaultsPersistentStoreSinkCancellable {
58+
public final func sinkSnapshot(_ sink: @escaping @Sendable (UserDefaultsSnapshot<Schema>) -> Void) -> UserDefaultsPersistentStoreSinkCancellable {
5959

60-
let token = UserDefaultsPersistentStoreSinkCancellable(owner: self)
61-
62-
initial: do {
60+
// deliver initial
61+
do {
6362
let snapshot = makeSnapshot()
6463

6564
sink(
6665
snapshot
6766
)
6867
}
6968

70-
add { [weak self] in
69+
return add { [weak self] in
7170
guard let self = self else { return }
7271

7372
let snapshot = self.makeSnapshot()
7473

75-
DispatchQueue.main.async {
74+
sink(
75+
snapshot
76+
)
77+
}
78+
79+
}
80+
81+
public final func sinkSnapshotOnMain(_ sink: @escaping @MainActor (UserDefaultsSnapshot<Schema>) -> Void) -> UserDefaultsPersistentStoreSinkCancellable {
82+
83+
// deliver initial
84+
do {
85+
let snapshot = makeSnapshot()
86+
87+
if Thread.isMainThread {
88+
MainActor.assumeIsolated {
89+
sink(
90+
snapshot
91+
)
92+
}
93+
} else {
94+
Task { @MainActor in
95+
sink(
96+
snapshot
97+
)
98+
}
99+
}
100+
}
101+
102+
return add { [weak self] in
103+
guard let self = self else { return }
104+
105+
let snapshot = self.makeSnapshot()
106+
107+
Task { @MainActor in
76108
sink(
77109
snapshot
78110
)
79111
}
80112
}
81113

82-
return token
83-
84114
}
85115

86116
}

Sources/UserDefaultsSnapshotLib/UserDefaultsPersistentStoreBase.swift

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ open class UserDefaultsPersistentStoreBase: @unchecked Sendable {
1616

1717
private let lock = NSLock()
1818

19-
@discardableResult
2019
public func add(_ eventReceiver: @escaping () -> Void) -> UserDefaultsPersistentStoreSinkCancellable {
2120
let token = UserDefaultsPersistentStoreSinkCancellable(owner: self)
2221
lock.lock()

Tests/UserDefaultsSnapshotLibTests/UserDefaultsBackingTests.swift

+28-8
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,21 @@ final class UserDefaultsBackingTests: XCTestCase {
8181
withExtendedLifetime(token) {}
8282
}
8383

84-
func testSinkUpdate() {
84+
func testSinkUpdate() async {
85+
86+
actor Storage {
87+
var results: [Int] = []
88+
var snapshots: [UserDefaultsSnapshot<UserDefaultsBackingTests.MyDefaults>] = []
89+
90+
func perform(_ closure: @escaping (isolated Storage) -> ()) {
91+
closure(self)
92+
}
93+
}
94+
8595
let exp = expectation(description: "wait")
8696
exp.expectedFulfillmentCount = 3
8797

88-
var results: [Int] = []
89-
var snapshots: [UserDefaultsSnapshot<UserDefaultsBackingTests.MyDefaults>] = []
98+
let storage = Storage()
9099

91100
let store = UserDefaultsPersistentStore<MyDefaults>(
92101
userDefaults: UserDefaults
@@ -96,9 +105,15 @@ final class UserDefaultsBackingTests: XCTestCase {
96105
// Start:
97106

98107
let token = store.sinkSnapshot { snap in
99-
results.append(snap.count)
100-
snapshots.append(snap)
101-
exp.fulfill()
108+
109+
Task {
110+
await storage.perform {
111+
$0.results.append(snap.count)
112+
$0.snapshots.append(snap)
113+
}
114+
exp.fulfill()
115+
}
116+
102117
}
103118

104119
store.write { d in
@@ -111,10 +126,15 @@ final class UserDefaultsBackingTests: XCTestCase {
111126

112127
wait(for: [exp], timeout: 1)
113128

114-
XCTAssertEqual(results, [0, 1, 2])
129+
let _results = await storage.results
130+
let _snapshots = await storage.snapshots
115131

116-
XCTAssertEqual(snapshots.map { $0.count }, [0, 1, 2])
132+
XCTAssertEqual(_results, [0, 1, 2])
133+
134+
XCTAssertEqual(_snapshots.map { $0.count }, [0, 1, 2])
117135

118136
withExtendedLifetime(token) {}
119137
}
120138
}
139+
140+

0 commit comments

Comments
 (0)