Convert refreshArticleStatus to async/await.

This commit is contained in:
Brent Simmons 2024-03-26 18:00:23 -07:00
parent 82679fb4b1
commit bf58443fe1
8 changed files with 81 additions and 13 deletions

View File

@ -28,7 +28,7 @@ import Secrets
func refreshAll(for account: Account) async throws func refreshAll(for account: Account) async throws
func syncArticleStatus(for account: Account) async throws func syncArticleStatus(for account: Account) async throws
func sendArticleStatus(for account: Account) async throws func sendArticleStatus(for account: Account) async throws
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) func refreshArticleStatus(for account: Account) async throws
func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void) func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void)

View File

@ -142,7 +142,20 @@ enum CloudKitAccountDelegateError: LocalizedError {
sendArticleStatus(for: account, showProgress: false, completion: completion) sendArticleStatus(for: account, showProgress: false, completion: completion)
} }
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) { func refreshArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
private func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {
let op = CloudKitReceiveStatusOperation(articlesZone: articlesZone) let op = CloudKitReceiveStatusOperation(articlesZone: articlesZone)
op.completionBlock = { mainThreadOperation in op.completionBlock = { mainThreadOperation in
Task { @MainActor in Task { @MainActor in

View File

@ -218,7 +218,21 @@ final class FeedbinAccountDelegate: AccountDelegate {
} }
} }
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) { func refreshArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
private func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {
os_log(.debug, log: log, "Refreshing article statuses...") os_log(.debug, log: log, "Refreshing article statuses...")

View File

@ -207,13 +207,27 @@ final class FeedlyAccountDelegate: AccountDelegate {
operationQueue.add(send) operationQueue.add(send)
} }
func refreshArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
/// Attempts to ensure local articles have the same status as they do remotely. /// Attempts to ensure local articles have the same status as they do remotely.
/// So if the user is using another client roughly simultaneously with this app, /// So if the user is using another client roughly simultaneously with this app,
/// this app does its part to ensure the articles have a consistent status between both. /// this app does its part to ensure the articles have a consistent status between both.
/// ///
/// - Parameter account: The account whose articles have a remote status. /// - Parameter account: The account whose articles have a remote status.
/// - Parameter completion: Call on the main queue. /// - Parameter completion: Call on the main queue.
@MainActor func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) { private func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {
guard let credentials = credentials else { guard let credentials = credentials else {
return completion(.success(())) return completion(.success(()))
} }

View File

@ -65,8 +65,7 @@ final class LocalAccountDelegate: AccountDelegate {
func sendArticleStatus(for account: Account) async throws { func sendArticleStatus(for account: Account) async throws {
} }
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) { func refreshArticleStatus(for account: Account) async throws {
completion(.success(()))
} }
func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void) { func importOPML(for account:Account, opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void) {

View File

@ -505,9 +505,10 @@ extension NewsBlurAccountDelegate {
// Download the initial articles // Download the initial articles
downloadFeed(account: account, feed: feed, page: 1) { result in downloadFeed(account: account, feed: feed, page: 1) { result in
self.refreshArticleStatus(for: account) { result in
switch result { Task { @MainActor in
case .success: do {
try await self.refreshArticleStatus(for: account)
self.refreshMissingStories(for: account) { result in self.refreshMissingStories(for: account) { result in
switch result { switch result {
case .success: case .success:
@ -521,8 +522,7 @@ extension NewsBlurAccountDelegate {
completion(.failure(error)) completion(.failure(error))
} }
} }
} catch {
case .failure(let error):
completion(.failure(error)) completion(.failure(error))
} }
} }

View File

@ -238,7 +238,21 @@ final class NewsBlurAccountDelegate: AccountDelegate {
} }
} }
func refreshArticleStatus(for account: Account, completion: @escaping (Result<Void, Error>) -> ()) { func refreshArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
private func refreshArticleStatus(for account: Account, completion: @escaping (Result<Void, Error>) -> ()) {
os_log(.debug, log: log, "Refreshing story statuses...") os_log(.debug, log: log, "Refreshing story statuses...")
let group = DispatchGroup() let group = DispatchGroup()

View File

@ -279,7 +279,21 @@ final class ReaderAPIAccountDelegate: AccountDelegate {
} }
} }
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) { func refreshArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
private func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {
os_log(.debug, log: log, "Refreshing article statuses...") os_log(.debug, log: log, "Refreshing article statuses...")
let group = DispatchGroup() let group = DispatchGroup()