Skip to content

Commit f00ddc1

Browse files
committed
Remove aggregate subscription. Minor access changes
1 parent 669d2fc commit f00ddc1

5 files changed

Lines changed: 4 additions & 117 deletions

File tree

Sources/CoreDataRepository/AggregateRepository.swift

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -214,43 +214,6 @@ public final class AggregateRepository {
214214
}
215215
}}.eraseToAnyPublisher()
216216
}
217-
218-
public func subscription<Value: Numeric>(_ publisher: AnyPublisher<Success<Value>, Failure>) -> AnyPublisher<Success<Value>, Failure> {
219-
return AnyPublisher.create { subscriber in
220-
let subject = PassthroughSubject<Success<Value>, Failure>()
221-
subject.sink(receiveCompletion: subscriber.send, receiveValue: subscriber.send).store(in: &self.cancellables)
222-
let id = UUID()
223-
var subscription: SubscriptionProvider?
224-
publisher.sink(
225-
receiveCompletion: { completion in
226-
if case .failure = completion {
227-
subject.send(completion: completion)
228-
}
229-
},
230-
receiveValue: { value in
231-
let castValue = value.result.first!.values.first!
232-
subscription = RepositorySubscription(
233-
id: id,
234-
request: value.request,
235-
context: self.context,
236-
success: { Success(function: value.function, result: $0 as? [[String: Value]] ?? [], request: value.request) },
237-
failure: { Failure(function: value.function, request: value.request, error: $0) },
238-
subject: subject
239-
)
240-
subscription?.start()
241-
if let sub = subscription {
242-
self.subscriptions.append(sub)
243-
}
244-
subject.send(value)
245-
246-
}
247-
).store(in: &self.cancellables)
248-
return AnyCancellable {
249-
subscription?.cancel()
250-
self.subscriptions.removeAll(where: { $0.id == id as AnyHashable })
251-
}
252-
}
253-
}
254217
}
255218

256219
// MARK: Extensions
@@ -273,9 +236,3 @@ extension NSExpressionDescription {
273236
return expDesc
274237
}
275238
}
276-
277-
extension AnyPublisher where Failure == AggregateRepository.Failure {
278-
func subscription<Value: Numeric>(_ repository: AggregateRepository) -> Self where Self.Output == AggregateRepository.Success<Value>, Self.Failure == AggregateRepository.Failure {
279-
repository.subscription(self)
280-
}
281-
}

Sources/CoreDataRepository/FetchRepository.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public final class FetchRepository {
1212
// MARK: Properties
1313
/// The context used by the repository.
1414
public let context: NSManagedObjectContext
15-
public var subscriptions = [SubscriptionProvider]()
15+
var subscriptions = [SubscriptionProvider]()
1616
public var cancellables = [AnyCancellable]()
1717

1818
// MARK: Init
@@ -122,7 +122,7 @@ public final class FetchRepository {
122122

123123
// MARK: Extensions
124124
extension AnyPublisher {
125-
func subscription<Model: UnmanagedModel>(_ repository: FetchRepository) -> Self where Self.Output == FetchRepository.Success<Model>, Self.Failure == FetchRepository.Failure<Model> {
125+
public func subscription<Model: UnmanagedModel>(_ repository: FetchRepository) -> Self where Self.Output == FetchRepository.Success<Model>, Self.Failure == FetchRepository.Failure<Model> {
126126
repository.subscription(self)
127127
}
128128
}

Sources/CoreDataRepository/RepositorySubscription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import CoreData
1010
import Combine
1111

1212
/// Re-fetches data as the context changes until canceled
13-
public class RepositorySubscription<
13+
class RepositorySubscription<
1414
Success,
1515
Failure: Error,
1616
Result: NSFetchRequestResult

Sources/CoreDataRepository/SubscriptionProvider.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// Created by Andrew Roan on 1/25/21.
66
//
77

8-
public protocol SubscriptionProvider {
8+
protocol SubscriptionProvider {
99
var id: AnyHashable { get }
1010
func manualFetch()
1111
func cancel()

Tests/CoreDataRepositoryTests/AggregateRepositoryTests.swift

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -150,74 +150,4 @@ final class AggregateRepositoryTests: CoreDataXCTestCase {
150150
})
151151
wait(for: [exp], timeout: 5)
152152
}
153-
154-
func testCountSubscriptionSuccess() {
155-
let firstExp = expectation(description: "Get count of CoreData Movies boxOffice")
156-
let secondExp = expectation(description: "Get count again after CoreData context is updated")
157-
let result: AnyPublisher<Success<Int>, Failure> = repository.count(predicate: NSPredicate(value: true), entityDesc: RepoMovie.entity()).subscription(repository)
158-
var resultCount = 0
159-
let cancellable = result.subscribe(on: backgroundQueue)
160-
.receive(on: mainQueue)
161-
.sink(receiveCompletion: { completion in
162-
switch completion {
163-
case .finished:
164-
XCTFail("Not expecting completion since subscription finishes after subscriber cancel")
165-
default:
166-
XCTFail("Not expecting failure")
167-
}
168-
}, receiveValue: { value in
169-
resultCount += 1
170-
let aggValue = value.result.first!.values.first!
171-
switch resultCount {
172-
case 1:
173-
assert(aggValue == 5, "Result value (count) should equal number of movies.")
174-
firstExp.fulfill()
175-
case 2:
176-
assert(aggValue == 4, "Result value (count) should equal number of movies.")
177-
secondExp.fulfill()
178-
default:
179-
break
180-
}
181-
})
182-
wait(for: [firstExp], timeout: 5)
183-
let crudRepository = CRUDRepository(context: self.backgroundContext)
184-
let _: AnyPublisher<CRUDRepository.Success<Movie>, CRUDRepository.Failure<Movie>> = crudRepository.delete(self.objectIDs.last!)
185-
wait(for: [secondExp], timeout: 5)
186-
cancellable.cancel()
187-
}
188-
189-
func testSumSubscriptionSuccess() {
190-
let firstExp = expectation(description: "Get count of CoreData Movies boxOffice")
191-
let secondExp = expectation(description: "Get count again after CoreData context is updated")
192-
var resultCount = 0
193-
let result: AnyPublisher<Success<Int>, Failure> = repository.sum(predicate: NSPredicate(value: true), entityDesc: RepoMovie.entity(), attributeDesc: RepoMovie.entity().attributesByName.values.first(where: { $0.name == "boxOffice" })!).subscription(repository)
194-
let cancellable = result.subscribe(on: backgroundQueue)
195-
.receive(on: mainQueue)
196-
.sink(receiveCompletion: { completion in
197-
switch completion {
198-
case .finished:
199-
XCTFail("Not expecting completion since subscription finishes after subscriber cancel")
200-
default:
201-
XCTFail("Not expecting failure")
202-
}
203-
}, receiveValue: { value in
204-
resultCount += 1
205-
let aggValue = value.result.first!.values.first!
206-
switch resultCount {
207-
case 1:
208-
assert(aggValue == 150, "Result value (count) should equal number of movies.")
209-
firstExp.fulfill()
210-
case 2:
211-
assert(aggValue == 150, "Result value (count) should equal number of movies.")
212-
secondExp.fulfill()
213-
default:
214-
XCTFail("Not expecting any values past the first two.")
215-
}
216-
})
217-
wait(for: [firstExp], timeout: 10)
218-
let crudRepository = CRUDRepository(context: self.backgroundContext)
219-
let _: AnyPublisher<CRUDRepository.Success<Movie>, CRUDRepository.Failure<Movie>> = crudRepository.delete(self.objectIDs.last!)
220-
wait(for: [secondExp], timeout: 5)
221-
cancellable.cancel()
222-
}
223153
}

0 commit comments

Comments
 (0)