diff --git a/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift b/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift index 7da6a9a6e..293d695c2 100644 --- a/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift +++ b/Account/Sources/Account/CloudKit/CloudKitAccountZoneDelegate.swift @@ -31,7 +31,8 @@ import CloudKitExtras self.articlesZone = articlesZone } - func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result) -> Void) { + func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey]) async throws { + for deletedRecordKey in deleted { switch deletedRecordKey.recordType { case CloudKitAccountZone.CloudKitFeed.recordType: @@ -53,8 +54,6 @@ import CloudKitExtras assertionFailure("Unknown record type: \(changedRecord.recordType)") } } - - completion(.success(())) } func addOrUpdateFeed(_ record: CKRecord) { diff --git a/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift b/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift index 1b855791e..5aaeed69b 100644 --- a/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift +++ b/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift @@ -66,7 +66,7 @@ final class CloudKitArticlesZone: CloudKitZone { migrateChangeToken() } - func refreshArticles(completion: @escaping ((Result) -> Void)) { + @MainActor func refreshArticles(completion: @escaping ((Result) -> Void)) { fetchChangesInZone() { result in switch result { case .success: diff --git a/Account/Sources/Account/CloudKit/CloudKitArticlesZoneDelegate.swift b/Account/Sources/Account/CloudKit/CloudKitArticlesZoneDelegate.swift index 02d3befc1..c93139442 100644 --- a/Account/Sources/Account/CloudKit/CloudKitArticlesZoneDelegate.swift +++ b/Account/Sources/Account/CloudKit/CloudKitArticlesZoneDelegate.swift @@ -32,7 +32,21 @@ class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate { self.articlesZone = articlesZone } - func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result) -> Void) { + func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey]) async throws { + + try await withCheckedThrowingContinuation { continuation in + self.cloudKitDidModify(changed: changed, deleted: deleted) { result in + switch result { + case .success: + continuation.resume() + case .failure(let error): + continuation.resume(throwing: error) + } + } + } + } + + private func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result) -> Void) { Task { @MainActor in do { diff --git a/CloudKitExtras/Sources/CloudKitExtras/CloudKitZone.swift b/CloudKitExtras/Sources/CloudKitExtras/CloudKitZone.swift index fce4e8df5..95d667cc4 100644 --- a/CloudKitExtras/Sources/CloudKitExtras/CloudKitZone.swift +++ b/CloudKitExtras/Sources/CloudKitExtras/CloudKitZone.swift @@ -29,7 +29,7 @@ public enum CloudKitZoneError: LocalizedError { public protocol CloudKitZoneDelegate: AnyObject { - func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result) -> Void); + func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey]) async throws } public typealias CloudKitRecordKey = (recordType: CKRecord.RecordType, recordID: CKRecord.ID) @@ -129,7 +129,7 @@ public extension CloudKitZone { } } - func receiveRemoteNotification(userInfo: [AnyHashable : Any], completion: @escaping () -> Void) { + @MainActor func receiveRemoteNotification(userInfo: [AnyHashable : Any], completion: @escaping () -> Void) { let note = CKRecordZoneNotification(fromRemoteNotificationDictionary: userInfo) guard note?.recordZoneID?.zoneName == zoneID.zoneName else { completion() @@ -736,7 +736,7 @@ public extension CloudKitZone { } /// Fetch all the changes in the CKZone since the last time we checked - func fetchChangesInZone(completion: @escaping (Result) -> Void) { + @MainActor func fetchChangesInZone(completion: @escaping (Result) -> Void) { var savedChangeToken = changeToken @@ -776,15 +776,12 @@ public extension CloudKitZone { switch CloudKitZoneResult.resolve(error) { case .success: - DispatchQueue.main.async { - self.delegate?.cloudKitDidModify(changed: changedRecords, deleted: deletedRecordKeys) { result in - switch result { - case .success: - self.changeToken = savedChangeToken - completion(.success(())) - case .failure(let error): - completion(.failure(error)) - } + Task { @MainActor in + do { + try await self.delegate?.cloudKitDidModify(changed: changedRecords, deleted: deletedRecordKeys) + completion(.success(())) + } catch { + completion(.failure(error)) } } case .zoneNotFound: