Skip to content

Commit 8b85942

Browse files
committed
Replace Combine's LoadResourcePresentationAdapter with async solution
1 parent a1b9435 commit 8b85942

4 files changed

Lines changed: 6 additions & 57 deletions

File tree

EssentialApp/EssentialApp/CommentsUIComposer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import EssentialFeediOS
1010
public final class CommentsUIComposer {
1111
private init() {}
1212

13-
private typealias CommentsPresentationAdapter = AsyncLoadResourcePresentationAdapter<[ImageComment], CommentsViewAdapter>
13+
private typealias CommentsPresentationAdapter = LoadResourcePresentationAdapter<[ImageComment], CommentsViewAdapter>
1414

1515
public static func commentsComposedWith(
1616
commentsLoader: @escaping () async throws -> [ImageComment]

EssentialApp/EssentialApp/FeedUIComposer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import EssentialFeediOS
1010
public final class FeedUIComposer {
1111
private init() {}
1212

13-
private typealias FeedPresentationAdapter = AsyncLoadResourcePresentationAdapter<Paginated<FeedImage>, FeedViewAdapter>
13+
private typealias FeedPresentationAdapter = LoadResourcePresentationAdapter<Paginated<FeedImage>, FeedViewAdapter>
1414

1515
public static func feedComposedWith(
1616
feedLoader: @MainActor @escaping () async throws -> Paginated<FeedImage>,

EssentialApp/EssentialApp/FeedViewAdapter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ final class FeedViewAdapter: ResourceView {
1313
private let selection: (FeedImage) -> Void
1414
private let currentFeed: [FeedImage: CellController]
1515

16-
private typealias ImageDataPresentationAdapter = AsyncLoadResourcePresentationAdapter<Data, WeakRefVirtualProxy<FeedImageCellController>>
17-
private typealias LoadMorePresentationAdapter = AsyncLoadResourcePresentationAdapter<Paginated<FeedImage>, FeedViewAdapter>
16+
private typealias ImageDataPresentationAdapter = LoadResourcePresentationAdapter<Data, WeakRefVirtualProxy<FeedImageCellController>>
17+
private typealias LoadMorePresentationAdapter = LoadResourcePresentationAdapter<Paginated<FeedImage>, FeedViewAdapter>
1818

1919
init(currentFeed: [FeedImage: CellController] = [:], controller: ListViewController, imageLoader: @escaping (URL) async throws -> Data, selection: @escaping (FeedImage) -> Void) {
2020
self.currentFeed = currentFeed

EssentialApp/EssentialApp/LoadResourcePresentationAdapter.swift

Lines changed: 2 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22
// Copyright © Essential Developer. All rights reserved.
33
//
44

5-
import Combine
65
import EssentialFeed
76
import EssentialFeediOS
87

98
@MainActor
10-
final class AsyncLoadResourcePresentationAdapter<Resource, View: ResourceView> {
9+
final class LoadResourcePresentationAdapter<Resource, View: ResourceView> {
1110
private let loader: () async throws -> Resource
1211
private var cancellable: Task<Void, Never>?
1312
private var isLoading = false
@@ -46,57 +45,6 @@ final class AsyncLoadResourcePresentationAdapter<Resource, View: ResourceView> {
4645
}
4746
}
4847

49-
extension AsyncLoadResourcePresentationAdapter: FeedImageCellControllerDelegate {
50-
func didRequestImage() {
51-
loadResource()
52-
}
53-
54-
func didCancelImageRequest() {
55-
cancellable?.cancel()
56-
cancellable = nil
57-
isLoading = false
58-
}
59-
}
60-
61-
@MainActor
62-
final class LoadResourcePresentationAdapter<Resource, View: ResourceView> {
63-
private let loader: () -> AnyPublisher<Resource, Error>
64-
private var cancellable: Cancellable?
65-
private var isLoading = false
66-
67-
var presenter: LoadResourcePresenter<Resource, View>?
68-
69-
init(loader: @escaping () -> AnyPublisher<Resource, Error>) {
70-
self.loader = loader
71-
}
72-
73-
func loadResource() {
74-
guard !isLoading else { return }
75-
76-
presenter?.didStartLoading()
77-
isLoading = true
78-
79-
cancellable = loader()
80-
.dispatchOnMainThread()
81-
.handleEvents(receiveCancel: { [weak self] in
82-
self?.isLoading = false
83-
})
84-
.sink(
85-
receiveCompletion: { [weak self] completion in
86-
switch completion {
87-
case .finished: break
88-
89-
case let .failure(error):
90-
self?.presenter?.didFinishLoading(with: error)
91-
}
92-
93-
self?.isLoading = false
94-
}, receiveValue: { [weak self] resource in
95-
self?.presenter?.didFinishLoading(with: resource)
96-
})
97-
}
98-
}
99-
10048
extension LoadResourcePresentationAdapter: FeedImageCellControllerDelegate {
10149
func didRequestImage() {
10250
loadResource()
@@ -105,5 +53,6 @@ extension LoadResourcePresentationAdapter: FeedImageCellControllerDelegate {
10553
func didCancelImageRequest() {
10654
cancellable?.cancel()
10755
cancellable = nil
56+
isLoading = false
10857
}
10958
}

0 commit comments

Comments
 (0)