From cffda791a80fe320d181a744ed0ea0dc79870514 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 27 Apr 2022 11:54:03 -0700 Subject: [PATCH] convert newsletter email publisher to async --- .../Views/Profile/NewsletterEmailsView.swift | 22 ++++------- .../Queries/NewsletterEmailsQuery.swift | 38 +++++++++---------- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Profile/NewsletterEmailsView.swift b/apple/OmnivoreKit/Sources/App/Views/Profile/NewsletterEmailsView.swift index dcd233a9e..c9f693d73 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Profile/NewsletterEmailsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Profile/NewsletterEmailsView.swift @@ -1,4 +1,3 @@ -import Combine import Models import Services import SwiftUI @@ -8,21 +7,16 @@ import Views @Published var isLoading = false @Published var emails = [NewsletterEmail]() - var subscriptions = Set() - - func loadEmails(dataService: DataService) { + func loadEmails(dataService: DataService) async { isLoading = true - dataService.newsletterEmailsPublisher().sink( - receiveCompletion: { _ in }, - receiveValue: { [weak self] objectIDs in - self?.isLoading = false - dataService.viewContext.perform { - self?.emails = objectIDs.compactMap { dataService.viewContext.object(with: $0) as? NewsletterEmail } - } + if let objectIDs = try? await dataService.newsletterEmails() { + await dataService.viewContext.perform { [weak self] in + self?.emails = objectIDs.compactMap { dataService.viewContext.object(with: $0) as? NewsletterEmail } } - ) - .store(in: &subscriptions) + } + + isLoading = false } func createEmail(dataService: DataService) async { @@ -58,7 +52,7 @@ struct NewsletterEmailsView: View { .listStyle(InsetListStyle()) #endif } - .task { viewModel.loadEmails(dataService: dataService) } + .task { await viewModel.loadEmails(dataService: dataService) } } private var innerBody: some View { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift index 1465c15e0..49545956c 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/NewsletterEmailsQuery.swift @@ -1,11 +1,10 @@ -import Combine import CoreData import Foundation import Models import SwiftGraphQL public extension DataService { - func newsletterEmailsPublisher() -> AnyPublisher<[NSManagedObjectID], ServerError> { + func newsletterEmails() async throws -> [NSManagedObjectID] { enum QueryResult { case success(result: [InternalNewsletterEmail]) case error(error: String) @@ -36,29 +35,26 @@ public extension DataService { let path = appEnvironment.graphqlPath let headers = networker.defaultHeaders + let context = backgroundContext - return Deferred { - Future { promise in - send(query, to: path, headers: headers) { result in - switch result { - case let .success(payload): - switch payload.data { - case let .success(result: result): - if let newsletterEmailObjectIDs = result.persist(context: self.backgroundContext) { - promise(.success(newsletterEmailObjectIDs)) - } else { - promise(.failure(.unknown)) - } - case .error: - promise(.failure(.unknown)) - } - case .failure: - promise(.failure(.unknown)) + return try await withCheckedThrowingContinuation { continuation in + send(query, to: path, headers: headers) { queryResult in + guard let payload = try? queryResult.get() else { + continuation.resume(throwing: BasicError.message(messageText: "network request failed")) + return + } + + switch payload.data { + case let .success(result: result): + if let newsletterEmailObjectIDs = result.persist(context: context) { + continuation.resume(returning: newsletterEmailObjectIDs) + } else { + continuation.resume(throwing: BasicError.message(messageText: "CoreData error")) } + case .error: + continuation.resume(throwing: BasicError.message(messageText: "Newsletter Email fetch error")) } } } - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() } }