@@ -94,29 +94,37 @@ public final class FetchRepository {
9494 }
9595
9696 public func subscription< Model: UnmanagedModel > ( _ publisher: AnyPublisher < Success < Model > , Failure < Model > > ) -> AnyPublisher < Success < Model > , Failure < Model > > {
97- let subject = PassthroughSubject < Success < Model > , Failure < Model > > ( )
98- let id = UUID ( )
99- publisher. sink (
100- receiveCompletion: { completion in
101- if case . failure = completion {
102- subject. send ( completion: completion)
97+ return AnyPublisher . create { subscriber in
98+ let subject = PassthroughSubject < Success < Model > , Failure < Model > > ( )
99+ subject. sink ( receiveCompletion: subscriber. send, receiveValue: subscriber. send) . store ( in: & self . cancellables)
100+ let id = UUID ( )
101+ var subscription : SubscriptionProvider ?
102+ publisher. sink (
103+ receiveCompletion: { completion in
104+ if case . failure = completion {
105+ subject. send ( completion: completion)
106+ }
107+ } ,
108+ receiveValue: { value in
109+ let subscriptionProvider = RepositorySubscription (
110+ id: id,
111+ request: value. fetchRequest,
112+ context: self . context,
113+ success: { Success ( items: $0. map { $0. asUnmanaged } , fetchRequest: value. fetchRequest) } ,
114+ failure: { Failure ( error: $0, fetchRequest: value. fetchRequest) } ,
115+ subject: subject
116+ )
117+ subscription = subscriptionProvider
118+ subscriptionProvider. start ( )
119+ self . subscriptions. append ( subscriptionProvider)
120+ subject. send ( value)
103121 }
104- } ,
105- receiveValue: { value in
106- let subscription = RepositorySubscription (
107- id: id,
108- request: value. fetchRequest,
109- context: self . context,
110- success: { Success ( items: $0. map { $0. asUnmanaged } , fetchRequest: value. fetchRequest) } ,
111- failure: { Failure ( error: $0, fetchRequest: value. fetchRequest) } ,
112- subject: subject
113- )
114- subscription. start ( )
115- self . subscriptions. append ( subscription)
116- subject. send ( value)
122+ ) . store ( in: & self . cancellables)
123+ return AnyCancellable {
124+ subscription? . cancel ( )
125+ self . subscriptions. removeAll ( where: { $0. id == id as AnyHashable } )
117126 }
118- ) . store ( in: & self . cancellables)
119- return subject. eraseToAnyPublisher ( )
127+ }
120128 }
121129}
122130
0 commit comments