Convert refreshAll to async/await.

This commit is contained in:
Brent Simmons
2024-03-25 23:36:27 -07:00
parent c18bb074d0
commit b2da353e8a
5 changed files with 70 additions and 59 deletions

View File

@@ -425,6 +425,20 @@ public enum FetchType {
delegate.refreshAll(for: self, completion: completion)
}
public func refreshAll() async throws {
try await withCheckedThrowingContinuation { continuation in
self.refreshAll { result in
switch result {
case .success:
continuation.resume()
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
public func sendArticleStatus(completion: ((Result<Void, Error>) -> Void)? = nil) {
delegate.sendArticleStatus(for: self) { result in
switch result {

View File

@@ -221,55 +221,46 @@ import Secrets
}
}
public func refreshAll(errorHandler: @escaping (Error) -> Void, completion: (() -> Void)? = nil) {
guard let reachability = try? Reachability(hostname: "apple.com"), reachability.connection != .unavailable else { return }
private func internetIsReachable() -> Bool {
let group = DispatchGroup()
activeAccounts.forEach { account in
group.enter()
account.refreshAll() { result in
group.leave()
switch result {
case .success:
break
case .failure(let error):
errorHandler(error)
}
}
}
group.notify(queue: DispatchQueue.main) {
completion?()
guard let reachability = try? Reachability(hostname: "apple.com"), reachability.connection != .unavailable else {
return false
}
return true
}
public func refreshAll(completion: (() -> Void)? = nil) {
guard let reachability = try? Reachability(hostname: "apple.com"), reachability.connection != .unavailable else { return }
public func refreshAll(errorHandler: ((Error) -> Void)? = nil) async {
guard internetIsReachable() else {
return
}
var syncErrors = [AccountSyncError]()
let group = DispatchGroup()
activeAccounts.forEach { account in
group.enter()
account.refreshAll() { result in
group.leave()
switch result {
case .success:
break
case .failure(let error):
syncErrors.append(AccountSyncError(account: account, error: error))
await withTaskGroup(of: Void.self) { taskGroup in
for account in self.activeAccounts {
taskGroup.addTask { @MainActor in
do {
try await account.refreshAll()
} catch {
if let errorHandler {
errorHandler(error)
}
let syncError = AccountSyncError(account: account, error: error)
syncErrors.append(syncError)
}
}
}
}
group.notify(queue: DispatchQueue.main) {
if syncErrors.count > 0 {
NotificationCenter.default.post(Notification(name: .AccountsDidFailToSyncWithErrors, object: self, userInfo: [Account.UserInfoKey.syncErrors: syncErrors]))
}
completion?()
if !syncErrors.isEmpty {
NotificationCenter.default.post(Notification(name: .AccountsDidFailToSyncWithErrors, object: self, userInfo: [Account.UserInfoKey.syncErrors: syncErrors]))
}
}
public func sendArticleStatusAll() async {