Convert AccountDelegate.syncArticleStatus to async/await.

This commit is contained in:
Brent Simmons
2023-10-27 22:13:29 -07:00
parent 98c8135d04
commit 6cd8715eb0
10 changed files with 92 additions and 83 deletions

View File

@@ -443,8 +443,8 @@ public enum FetchType {
}
}
public func syncArticleStatus(completion: ((Result<Void, Error>) -> Void)? = nil) {
delegate.syncArticleStatus(for: self, completion: completion)
public func syncArticleStatus() async throws {
try await delegate.syncArticleStatus(for: self)
}
public func importOPML(_ opmlFile: URL, completion: @escaping (Result<Void, Error>) -> Void) {
@@ -453,7 +453,7 @@ public enum FetchType {
return
}
delegate.importOPML(for: self, opmlFile: opmlFile) { result in
delegate.importOPML(for: self, opmlFile: opmlFile) { result in
Task { @MainActor in
switch result {
case .success:

View File

@@ -26,7 +26,7 @@ import Secrets
func receiveRemoteNotification(for account: Account, userInfo: [AnyHashable : Any]) async
func refreshAll(for account: Account) async throws
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)?)
func syncArticleStatus(for account: Account) async throws
func sendArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void))
func refreshArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void))

View File

@@ -108,20 +108,22 @@ public enum FeedbinAccountDelegateError: String, Error {
}
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
completion?(.success(()))
case .failure(let error):
completion?(.failure(error))
func syncArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion?(.failure(error))
}
}
}

View File

@@ -72,8 +72,8 @@ final class LocalAccountDelegate: AccountDelegate, Logging {
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
completion?(.success(()))
func syncArticleStatus(for account: Account) async throws {
return
}
func sendArticleStatus(for account: Account, completion: @escaping ((Result<Void, Error>) -> Void)) {

View File

@@ -131,20 +131,22 @@ final class NewsBlurAccountDelegate: AccountDelegate, Logging {
}
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
completion?(.success(()))
case .failure(let error):
completion?(.failure(error))
func syncArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion?(.failure(error))
}
}
}

View File

@@ -182,25 +182,26 @@ public enum ReaderAPIAccountDelegateError: LocalizedError {
}
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
func syncArticleStatus(for account: Account) async throws {
guard variant != .inoreader else {
completion?(.success(()))
return
}
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
completion?(.success(()))
case .failure(let error):
completion?(.failure(error))
try await withCheckedThrowingContinuation { continuation in
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion?(.failure(error))
}
}
}

View File

@@ -280,18 +280,16 @@ import RSDatabase
}
}
public func syncArticleStatusAll(completion: (() -> Void)? = nil) {
let group = DispatchGroup()
for account in activeAccounts {
group.enter()
account.syncArticleStatus() { _ in
group.leave()
}
}
public func syncArticleStatusAll() async {
group.notify(queue: DispatchQueue.global(qos: .background)) {
completion?()
await withTaskGroup(of: Void.self) { group in
for account in activeAccounts {
group.addTask {
try? await account.syncArticleStatus()
}
}
await group.waitForAll()
}
}

View File

@@ -101,20 +101,23 @@ final class CloudKitAccountDelegate: AccountDelegate, Logging {
}
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
completion?(.success(()))
case .failure(let error):
completion?(.failure(error))
func syncArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
case .failure(let error):
continuation.resume(throwing: error)
}
case .failure(let error):
completion?(.failure(error))
}
}
}

View File

@@ -146,22 +146,25 @@ final class FeedlyAccountDelegate: AccountDelegate, Logging {
}
}
func syncArticleStatus(for account: Account, completion: ((Result<Void, Error>) -> Void)? = nil) {
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
completion?(.success(()))
case .failure(let error):
self.logger.error("Failed to refresh article status for account \(String(describing: account.type), privacy: .public): \(error.localizedDescription, privacy: .public)")
completion?(.failure(error))
func syncArticleStatus(for account: Account) async throws {
try await withCheckedThrowingContinuation { continuation in
sendArticleStatus(for: account) { result in
switch result {
case .success:
self.refreshArticleStatus(for: account) { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
self.logger.error("Failed to refresh article status for account \(String(describing: account.type), privacy: .public): \(error.localizedDescription, privacy: .public)")
continuation.resume(throwing: error)
}
}
case .failure(let error):
self.logger.error("Failed to send article status for account \(String(describing: account.type), privacy: .public): \(error.localizedDescription, privacy: .public)")
continuation.resume(throwing: error)
}
case .failure(let error):
self.logger.error("Failed to send article status for account \(String(describing: account.type), privacy: .public): \(error.localizedDescription, privacy: .public)")
completion?(.failure(error))
}
}
}

View File

@@ -68,8 +68,8 @@ class ArticleStatusSyncTimer {
lastTimedRefresh = Date()
update()
AccountManager.shared.syncArticleStatusAll()
Task {
await AccountManager.shared.syncArticleStatusAll()
}
}
}