From ac9ba39ea2f54fee7cfe380d6d4333c49ea3228b Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 27 Jul 2020 16:00:01 -0500 Subject: [PATCH] Do CloudKit record process loop on a high priority background thread so that it doesn't block the main thread --- .../CloudKitArticlesZoneDelegate.swift | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift index 74a7dc1a5..1e7504764 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift @@ -132,26 +132,34 @@ private extension CloudKitArticlesZoneDelegate { group.leave() } - let parsedItems = records.compactMap { makeParsedItem($0) } - let webFeedIDsAndItems = Dictionary(grouping: parsedItems, by: { item in item.feedURL } ).mapValues { Set($0) } - for (webFeedID, parsedItems) in webFeedIDsAndItems { - group.enter() - self.account?.update(webFeedID, with: parsedItems, deleteOlder: false) { result in - switch result { - case .success(let articleChanges): - guard let deletes = articleChanges.deletedArticles, !deletes.isEmpty else { - group.leave() - return + group.enter() + DispatchQueue.global(qos: .userInitiated).async { + let parsedItems = records.compactMap { self.makeParsedItem($0) } + let webFeedIDsAndItems = Dictionary(grouping: parsedItems, by: { item in item.feedURL } ).mapValues { Set($0) } + + DispatchQueue.main.async { + for (webFeedID, parsedItems) in webFeedIDsAndItems { + group.enter() + self.account?.update(webFeedID, with: parsedItems, deleteOlder: false) { result in + switch result { + case .success(let articleChanges): + guard let deletes = articleChanges.deletedArticles, !deletes.isEmpty else { + group.leave() + return + } + let syncStatuses = deletes.map { SyncStatus(articleID: $0.articleID, key: .deleted, flag: true) } + try? self.database.insertStatuses(syncStatuses) + group.leave() + case .failure(let databaseError): + errorOccurred = true + os_log(.error, log: self.log, "Error occurred while storing articles: %@", databaseError.localizedDescription) + group.leave() + } } - let syncStatuses = deletes.map { SyncStatus(articleID: $0.articleID, key: .deleted, flag: true) } - try? self.database.insertStatuses(syncStatuses) - group.leave() - case .failure(let databaseError): - errorOccurred = true - os_log(.error, log: self.log, "Error occurred while storing articles: %@", databaseError.localizedDescription) - group.leave() } + group.leave() } + } group.notify(queue: DispatchQueue.main) {