convert newsletter email publisher to async

This commit is contained in:
Satindar Dhillon 2022-04-27 11:54:03 -07:00
parent 461249db59
commit cffda791a8
2 changed files with 25 additions and 35 deletions

View file

@ -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<AnyCancellable>()
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 {

View file

@ -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()
}
}