mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
convert newsletter email publisher to async
This commit is contained in:
parent
461249db59
commit
cffda791a8
2 changed files with 25 additions and 35 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue