File tree 2 files changed +45
-2
lines changed
2 files changed +45
-2
lines changed Original file line number Diff line number Diff line change @@ -70,19 +70,22 @@ public extension ObservableObjectAtom {
70
70
AtomProducer { context in
71
71
context. transaction ( object)
72
72
} manageValue: { object, context in
73
+ var task : Task < Void , Never > ?
73
74
let cancellable = object
74
75
. objectWillChange
75
76
. sink { [ weak object] _ in
76
77
// Wait until the object's property is set, because `objectWillChange`
77
78
// emits an event before the property is updated.
78
- Task { @MainActor in
79
- if !context. isTerminated, let object {
79
+ task? . cancel ( )
80
+ task = Task { @MainActor in
81
+ if let object, !Task. isCancelled, !context. isTerminated {
80
82
context. update ( with: object)
81
83
}
82
84
}
83
85
}
84
86
85
87
context. onTermination = {
88
+ task? . cancel ( )
86
89
cancellable. cancel ( )
87
90
}
88
91
}
Original file line number Diff line number Diff line change @@ -116,4 +116,44 @@ final class ObservableObjectAtomTests: XCTestCase {
116
116
XCTAssertEqual ( effect. updatedCount, 3 )
117
117
XCTAssertEqual ( effect. releasedCount, 1 )
118
118
}
119
+
120
+ @MainActor
121
+ func testUpdateMultipletimes( ) async {
122
+ final class TestObject : ObservableObject {
123
+ @Published
124
+ var value0 = 0
125
+ @Published
126
+ var value1 = 0
127
+
128
+ func update( ) {
129
+ value0 += 1
130
+ value1 += 1
131
+ }
132
+ }
133
+
134
+ struct TestAtom : ObservableObjectAtom , Hashable {
135
+ func object( context: Context ) -> TestObject {
136
+ TestObject ( )
137
+ }
138
+ }
139
+
140
+ let atom = TestAtom ( )
141
+ let context = AtomTestContext ( )
142
+ let object = context. watch ( atom)
143
+ var updatedCount = 0
144
+
145
+ context. onUpdate = {
146
+ updatedCount += 1
147
+ }
148
+
149
+ object. update ( )
150
+
151
+ await context. wait ( for: atom) {
152
+ $0. value0 == 1 && $0. value1 == 1
153
+ }
154
+
155
+ XCTAssertEqual ( updatedCount, 1 )
156
+ XCTAssertEqual ( object. value0, 1 )
157
+ XCTAssertEqual ( object. value1, 1 )
158
+ }
119
159
}
You can’t perform that action at this time.
0 commit comments