Make cloudKitDidModify an async/await function.

This commit is contained in:
Brent Simmons 2024-04-13 11:15:50 -07:00
parent 75b16d206d
commit 18e0c48bd8
4 changed files with 27 additions and 17 deletions

View File

@ -31,7 +31,8 @@ import CloudKitExtras
self.articlesZone = articlesZone
}
func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result<Void, Error>) -> 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) {

View File

@ -66,7 +66,7 @@ final class CloudKitArticlesZone: CloudKitZone {
migrateChangeToken()
}
func refreshArticles(completion: @escaping ((Result<Void, Error>) -> Void)) {
@MainActor func refreshArticles(completion: @escaping ((Result<Void, Error>) -> Void)) {
fetchChangesInZone() { result in
switch result {
case .success:

View File

@ -32,7 +32,21 @@ class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate {
self.articlesZone = articlesZone
}
func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result<Void, Error>) -> 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, Error>) -> Void) {
Task { @MainActor in
do {

View File

@ -29,7 +29,7 @@ public enum CloudKitZoneError: LocalizedError {
public protocol CloudKitZoneDelegate: AnyObject {
func cloudKitDidModify(changed: [CKRecord], deleted: [CloudKitRecordKey], completion: @escaping (Result<Void, Error>) -> 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, Error>) -> Void) {
@MainActor func fetchChangesInZone(completion: @escaping (Result<Void, Error>) -> 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: