@@ -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