Skip to content

Commit 1a029ce

Browse files
committed
Add async composition to load first feed page
1 parent 69c48d7 commit 1a029ce

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

EssentialApp/EssentialApp/SceneDelegate.swift

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,52 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
9696
}
9797
}
9898

99+
private func loadRemoteFeedWithLocalFallback() async throws -> Paginated<FeedImage> {
100+
do {
101+
let feed = try await loadAndCacheRemoteFeed()
102+
return makeFirstPage(items: feed)
103+
} catch {
104+
let feed = try await loadLocalFeed()
105+
return makeFirstPage(items: feed)
106+
}
107+
}
108+
109+
private func loadAndCacheRemoteFeed() async throws -> [FeedImage] {
110+
let feed = try await loadRemoteFeed()
111+
await store.schedule { [store] in
112+
let localFeedLoader = LocalFeedLoader(store: store, currentDate: Date.init)
113+
try? localFeedLoader.save(feed)
114+
}
115+
return feed
116+
}
117+
118+
private func loadLocalFeed() async throws -> [FeedImage] {
119+
try await store.schedule { [store] in
120+
let localFeedLoader = LocalFeedLoader(store: store, currentDate: Date.init)
121+
return try localFeedLoader.load()
122+
}
123+
}
124+
125+
private func loadRemoteFeed(after: FeedImage? = nil) async throws -> [FeedImage] {
126+
let url = FeedEndpoint.get(after: after).url(baseURL: baseURL)
127+
let (data, response) = try await httpClient.get(from: url)
128+
return try FeedItemsMapper.map(data, from: response)
129+
}
130+
99131
private func makeRemoteFeedLoaderWithLocalFallback() -> AnyPublisher<Paginated<FeedImage>, Error> {
100-
makeRemoteFeedLoader()
101-
.receive(on: scheduler)
102-
.caching(to: localFeedLoader)
103-
.fallback(to: localFeedLoader.loadPublisher)
104-
.map(makeFirstPage)
105-
.eraseToAnyPublisher()
132+
Deferred {
133+
Future { completion in
134+
Task.immediate {
135+
do {
136+
let feed = try await self.loadRemoteFeedWithLocalFallback()
137+
completion(.success(feed))
138+
} catch {
139+
completion(.failure(error))
140+
}
141+
}
142+
}
143+
}
144+
.eraseToAnyPublisher()
106145
}
107146

108147
private func makeRemoteLoadMoreLoader(last: FeedImage?) -> AnyPublisher<Paginated<FeedImage>, Error> {

0 commit comments

Comments
 (0)