@@ -9,7 +9,7 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
9
9
public typealias Output = Result < ( Model , UpdateSource ) , Error >
10
10
let _subject : CurrentValueSubject < Output ? , Never > = . init( nil )
11
11
var publisher : AnyPublisher < Output , Never > { _subject. compactMap ( { $0 } ) . eraseToAnyPublisher ( ) }
12
- public var cancellables : Set < AnyCancellable > = [ ]
12
+ @ Atomic public var cancellables : Set < AnyCancellable > = [ ]
13
13
public let pager : any AsyncPagerType
14
14
15
15
public var canLoadNext : Bool { get async { await pager. canLoadNext } }
@@ -18,45 +18,51 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
18
18
init < Pager: AsyncGraphQLQueryPagerCoordinator < InitialQuery , PaginatedQuery > , InitialQuery, PaginatedQuery> (
19
19
pager: Pager ,
20
20
transform: @escaping ( [ PaginatedQuery . Data ] , InitialQuery . Data , [ PaginatedQuery . Data ] ) throws -> Model
21
- ) async {
21
+ ) {
22
22
self . pager = pager
23
- await pager. subscribe { [ weak self] result in
24
- guard let self else { return }
25
- let returnValue : Output
23
+ Task {
24
+ let cancellable = await pager. subscribe { [ weak self] result in
25
+ guard let self else { return }
26
+ let returnValue : Output
26
27
27
- switch result {
28
- case let . success( ( output, source) ) :
29
- do {
30
- let transformedModels = try transform ( output. previousPages, output. initialPage, output. nextPages)
31
- returnValue = . success( ( transformedModels, source) )
32
- } catch {
28
+ switch result {
29
+ case let . success( ( output, source) ) :
30
+ do {
31
+ let transformedModels = try transform ( output. previousPages, output. initialPage, output. nextPages)
32
+ returnValue = . success( ( transformedModels, source) )
33
+ } catch {
34
+ returnValue = . failure( error)
35
+ }
36
+ case let . failure( error) :
33
37
returnValue = . failure( error)
34
38
}
35
- case let . failure( error) :
36
- returnValue = . failure( error)
37
- }
38
39
39
- _subject. send ( returnValue)
40
- } . store ( in: & cancellables)
40
+ _subject. send ( returnValue)
41
+ }
42
+ _ = $cancellables. mutate { $0. insert ( cancellable) }
43
+ }
41
44
}
42
45
43
46
init < Pager: AsyncGraphQLQueryPagerCoordinator < InitialQuery , PaginatedQuery > , InitialQuery, PaginatedQuery> (
44
47
pager: Pager
45
- ) async where Model == PaginationOutput < InitialQuery , PaginatedQuery > {
48
+ ) where Model == PaginationOutput < InitialQuery , PaginatedQuery > {
46
49
self . pager = pager
47
- await pager. subscribe { [ weak self] result in
48
- guard let self else { return }
49
- let returnValue : Output
50
+ Task {
51
+ let cancellable = await pager. subscribe { [ weak self] result in
52
+ guard let self else { return }
53
+ let returnValue : Output
50
54
51
- switch result {
52
- case let . success( ( output, source) ) :
53
- returnValue = . success( ( output, source) )
54
- case let . failure( error) :
55
- returnValue = . failure( error)
56
- }
55
+ switch result {
56
+ case let . success( ( output, source) ) :
57
+ returnValue = . success( ( output, source) )
58
+ case let . failure( error) :
59
+ returnValue = . failure( error)
60
+ }
57
61
58
- _subject. send ( returnValue)
59
- } . store ( in: & cancellables)
62
+ _subject. send ( returnValue)
63
+ }
64
+ _ = $cancellables. mutate { $0. insert ( cancellable) }
65
+ }
60
66
}
61
67
62
68
convenience init <
@@ -68,8 +74,8 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
68
74
pager: Pager ,
69
75
initialTransform: @escaping ( InitialQuery . Data ) throws -> Model ,
70
76
pageTransform: @escaping ( PaginatedQuery . Data ) throws -> Model
71
- ) async where Model: RangeReplaceableCollection , Model. Element == Element {
72
- await self . init (
77
+ ) where Model: RangeReplaceableCollection , Model. Element == Element {
78
+ self . init (
73
79
pager: pager,
74
80
transform: { previousData, initialData, nextData in
75
81
let previous = try previousData. flatMap { try pageTransform ( $0) }
@@ -93,7 +99,7 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
93
99
pageResolver: ( ( P , PaginationDirection ) -> PaginatedQuery ? ) ? ,
94
100
initialTransform: @escaping ( InitialQuery . Data ) throws -> Model ,
95
101
pageTransform: @escaping ( PaginatedQuery . Data ) throws -> Model
96
- ) async where Model: RangeReplaceableCollection , Model. Element == Element {
102
+ ) where Model: RangeReplaceableCollection , Model. Element == Element {
97
103
let pager = AsyncGraphQLQueryPagerCoordinator (
98
104
client: client,
99
105
initialQuery: initialQuery,
@@ -108,7 +114,7 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
108
114
} ,
109
115
pageResolver: pageResolver
110
116
)
111
- await self . init (
117
+ self . init (
112
118
pager: pager,
113
119
initialTransform: initialTransform,
114
120
pageTransform: pageTransform
@@ -137,15 +143,15 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
137
143
watcherDispatchQueue: DispatchQueue = . main,
138
144
extractPageInfo: @escaping ( PageExtractionData < InitialQuery , PaginatedQuery , Model ? > ) -> P ,
139
145
pageResolver: ( ( P , PaginationDirection ) -> PaginatedQuery ? ) ?
140
- ) async where Model == PaginationOutput < InitialQuery , PaginatedQuery > {
146
+ ) where Model == PaginationOutput < InitialQuery , PaginatedQuery > {
141
147
let pager = AsyncGraphQLQueryPagerCoordinator (
142
148
client: client,
143
149
initialQuery: initialQuery,
144
150
watcherDispatchQueue: watcherDispatchQueue,
145
151
extractPageInfo: extractPageInfo,
146
152
pageResolver: pageResolver
147
153
)
148
- await self . init (
154
+ self . init (
149
155
pager: pager
150
156
)
151
157
}
@@ -161,7 +167,7 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
161
167
extractPageInfo: @escaping ( PageExtractionData < InitialQuery , PaginatedQuery , Model ? > ) -> P ,
162
168
pageResolver: ( ( P , PaginationDirection ) -> PaginatedQuery ? ) ? ,
163
169
transform: @escaping ( [ PaginatedQuery . Data ] , InitialQuery . Data , [ PaginatedQuery . Data ] ) throws -> Model
164
- ) async {
170
+ ) {
165
171
let pager = AsyncGraphQLQueryPagerCoordinator (
166
172
client: client,
167
173
initialQuery: initialQuery,
@@ -176,7 +182,7 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
176
182
} ,
177
183
pageResolver: pageResolver
178
184
)
179
- await self . init (
185
+ self . init (
180
186
pager: pager,
181
187
transform: transform
182
188
)
@@ -191,9 +197,10 @@ public class AsyncGraphQLQueryPager<Model>: Publisher {
191
197
/// Subscribe to the results of the pager, with the management of the subscriber being stored internally to the `AnyGraphQLQueryPager`.
192
198
/// - Parameter completion: The closure to trigger when new values come in.
193
199
public func subscribe( completion: @MainActor @escaping ( Output ) -> Void ) {
194
- publisher. sink { result in
200
+ let cancellable = publisher. sink { result in
195
201
Task { await completion ( result) }
196
- } . store ( in: & cancellables)
202
+ }
203
+ _ = $cancellables. mutate { $0. insert ( cancellable) }
197
204
}
198
205
199
206
/// Load the next page, if available.
0 commit comments