Skip to content

Commit 4d42afb

Browse files
committed
Wrap subscription in Publishers.Create for cleanup on cancel
1 parent 8362489 commit 4d42afb

3 files changed

Lines changed: 342 additions & 48 deletions

File tree

Sources/CoreDataRepository/FetchRepository.swift

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)