From 8e890ec17725dbd168b4ab8be06557e042af0d58 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 27 Jul 2020 16:08:09 -0500 Subject: [PATCH] Move CloudKit record creation to a high priority background queue so that it isn't blocking main --- .../CloudKit/CloudKitArticlesZone.swift | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift index 6db210674..3268e9cd2 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZone.swift @@ -114,35 +114,38 @@ final class CloudKitArticlesZone: CloudKitZone { var newRecords = [CKRecord]() var deleteRecordIDs = [CKRecord.ID]() - for statusUpdate in statusUpdates { - switch statusUpdate.record { - case .all: - modifyRecords.append(makeStatusRecord(statusUpdate)) - modifyRecords.append(makeArticleRecord(statusUpdate.article!)) - case .new: - newRecords.append(makeStatusRecord(statusUpdate)) - newRecords.append(makeArticleRecord(statusUpdate.article!)) - case .delete: - deleteRecordIDs.append(CKRecord.ID(recordName: statusID(statusUpdate.articleID), zoneID: Self.zoneID)) - case .statusOnly: - modifyRecords.append(makeStatusRecord(statusUpdate)) - deleteRecordIDs.append(CKRecord.ID(recordName: articleID(statusUpdate.articleID), zoneID: Self.zoneID)) - } - } - - modify(recordsToSave: modifyRecords, recordIDsToDelete: deleteRecordIDs) { result in - switch result { - case .success: - self.saveIfNew(newRecords) { result in - switch result { - case .success: - completion(.success(())) - case .failure(let error): - completion(.failure(error)) - } + DispatchQueue.global(qos: .userInitiated).async { + + for statusUpdate in statusUpdates { + switch statusUpdate.record { + case .all: + modifyRecords.append(self.makeStatusRecord(statusUpdate)) + modifyRecords.append(self.makeArticleRecord(statusUpdate.article!)) + case .new: + newRecords.append(self.makeStatusRecord(statusUpdate)) + newRecords.append(self.makeArticleRecord(statusUpdate.article!)) + case .delete: + deleteRecordIDs.append(CKRecord.ID(recordName: self.statusID(statusUpdate.articleID), zoneID: Self.zoneID)) + case .statusOnly: + modifyRecords.append(self.makeStatusRecord(statusUpdate)) + deleteRecordIDs.append(CKRecord.ID(recordName: self.articleID(statusUpdate.articleID), zoneID: Self.zoneID)) + } + } + + self.modify(recordsToSave: modifyRecords, recordIDsToDelete: deleteRecordIDs) { result in + switch result { + case .success: + self.saveIfNew(newRecords) { result in + switch result { + case .success: + completion(.success(())) + case .failure(let error): + completion(.failure(error)) + } + } + case .failure(let error): + self.handleModifyArticlesError(error, statusUpdates: statusUpdates, completion: completion) } - case .failure(let error): - self.handleModifyArticlesError(error, statusUpdates: statusUpdates, completion: completion) } } }