From fe9ade5e85c4b72cb89371e4200f577b15a709d0 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 13 Apr 2020 04:59:41 -0500 Subject: [PATCH] Tune the add CloudKit account process. --- .../CloudKit/CloudKitAccountDelegate.swift | 59 +++++++++++++++---- .../CloudKitArticlesZoneDelegate.swift | 7 ++- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift index 63572332e..276ac113d 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift @@ -92,7 +92,7 @@ final class CloudKitAccountDelegate: AccountDelegate { return } - refreshAll(for: account, downloadFeeds: true, completion: completion) + standardRefreshAll(for: account, completion: completion) } func sendArticleStatus(for account: Account, completion: @escaping ((Result) -> Void)) { @@ -205,7 +205,7 @@ final class CloudKitAccountDelegate: AccountDelegate { // TODO: remove duplicates created by import self.accountZone.importOPML(rootExternalID: rootExternalID, items: normalizedItems) { _ in - self.refreshAll(for: account, downloadFeeds: false, completion: completion) + self.initialRefreshAll(for: account, completion: completion) } } @@ -483,7 +483,7 @@ final class CloudKitAccountDelegate: AccountDelegate { switch result { case .success(let externalID): account.externalID = externalID - self.refreshAll(for: account, downloadFeeds: false) { _ in } + self.initialRefreshAll(for: account) { _ in } case .failure(let error): os_log(.error, log: self.log, "Error adding account container: %@", error.localizedDescription) } @@ -523,9 +523,49 @@ final class CloudKitAccountDelegate: AccountDelegate { private extension CloudKitAccountDelegate { - func refreshAll(for account: Account, downloadFeeds: Bool, completion: @escaping (Result) -> Void) { + func initialRefreshAll(for account: Account, completion: @escaping (Result) -> Void) { - let intialWebFeedsCount = downloadFeeds ? account.flattenedWebFeeds().count : 0 + func fail(_ error: Error) { + self.processAccountError(account, error) + self.refreshProgress.clear() + completion(.failure(error)) + } + + refreshProgress.addToNumberOfTasksAndRemaining(3) + refreshArticleStatus(for: account) { result in + switch result { + case .success: + + self.refreshProgress.completeTask() + self.accountZone.fetchChangesInZone() { result in + switch result { + case .success: + + self.refreshProgress.completeTask() + self.sendArticleStatus(for: account) { result in + switch result { + case .success: + self.refreshProgress.completeTask() + completion(.success(())) + case .failure(let error): + fail(error) + } + } + + case .failure(let error): + fail(error) + } + } + case .failure(let error): + fail(error) + } + } + + } + + func standardRefreshAll(for account: Account, completion: @escaping (Result) -> Void) { + + let intialWebFeedsCount = account.flattenedWebFeeds().count refreshProgress.addToNumberOfTasksAndRemaining(3 + intialWebFeedsCount) func fail(_ error: Error) { @@ -539,9 +579,7 @@ private extension CloudKitAccountDelegate { case .success: let webFeeds = account.flattenedWebFeeds() - if downloadFeeds { - self.refreshProgress.addToNumberOfTasksAndRemaining(webFeeds.count - intialWebFeedsCount) - } + self.refreshProgress.addToNumberOfTasksAndRemaining(webFeeds.count - intialWebFeedsCount) self.refreshProgress.completeTask() self.sendArticleStatus(for: account) { result in @@ -555,11 +593,6 @@ private extension CloudKitAccountDelegate { self.refreshProgress.completeTask() - guard downloadFeeds else { - completion(.success(())) - return - } - self.refresher.refreshFeeds(webFeeds) { account.metadata.lastArticleFetchEndTime = Date() diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift index 618212577..a5c1baf3e 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift @@ -110,8 +110,13 @@ private extension CloudKitArticlesZoneDelegate { webFeeds.forEach { $0.dropConditionalGetInfo() } self.refreshProgress?.addToNumberOfTasksAndRemaining(webFeeds.count) - self.refresher.refreshFeeds(webFeeds) { + + if webFeeds.isEmpty { group.leave() + } else { + self.refresher.refreshFeeds(webFeeds) { + group.leave() + } } }