Fix numerous concurrency warnings in CloudKit code.

This commit is contained in:
Brent Simmons
2024-04-17 22:14:36 -07:00
parent 88ec8b20c2
commit 254a02cd8e
4 changed files with 268 additions and 335 deletions

View File

@@ -24,9 +24,9 @@ enum CloudKitAccountZoneError: LocalizedError {
@MainActor final class CloudKitAccountZone: CloudKitZone {
var zoneID: CKRecordZone.ID
var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
let zoneID: CKRecordZone.ID
let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
weak var container: CKContainer?
weak var database: CKDatabase?
@@ -240,7 +240,7 @@ enum CloudKitAccountZoneError: LocalizedError {
return try await findOrCreateAccount()
case .zoneNotFound, .userDeletedZone:
try await createZoneRecord()
_ = try await createZoneRecord()
return try await findOrCreateAccount()
default:

View File

@@ -59,7 +59,7 @@ final class CloudKitArticlesZone: CloudKitZone {
}
}
init(container: CKContainer) {
@MainActor init(container: CKContainer) {
self.container = container
self.database = container.privateCloudDatabase
self.zoneID = CKRecordZone.ID(zoneName: "Articles", ownerName: CKCurrentUserDefaultName)
@@ -73,16 +73,16 @@ final class CloudKitArticlesZone: CloudKitZone {
completion(.success(()))
case .failure(let error):
if case CloudKitZoneError.userDeletedZone = error {
self.createZoneRecord() { result in
switch result {
case .success:
Task { @MainActor in
self.refreshArticles(completion: completion)
}
case .failure(let error):
Task { @MainActor in
do {
_ = try await self.createZoneRecord()
self.refreshArticles(completion: completion)
} catch {
completion(.failure(error))
}
}
} else {
completion(.failure(error))
}
@@ -174,16 +174,16 @@ private extension CloudKitArticlesZone {
@MainActor func handleModifyArticlesError(_ error: Error, statusUpdates: [CloudKitArticleStatusUpdate], completion: @escaping ((Result<Void, Error>) -> Void)) {
if case CloudKitZoneError.userDeletedZone = error {
self.createZoneRecord() { result in
switch result {
case .success:
MainActor.assumeIsolated {
self.modifyArticles(statusUpdates, completion: completion)
}
case .failure(let error):
Task { @MainActor in
do {
_ = try await self.createZoneRecord()
self.modifyArticles(statusUpdates, completion: completion)
} catch {
completion(.failure(error))
}
}
} else {
completion(.failure(error))
}