Fix deprecation warning.

This commit is contained in:
Brent Simmons 2024-04-22 17:58:04 -07:00
parent d52e53d2e8
commit c0619d2364

View File

@ -193,33 +193,77 @@ enum CloudKitAccountZoneError: LocalizedError {
public func findOrCreateAccount() async throws -> String { public func findOrCreateAccount() async throws -> String {
guard let database else { throw CloudKitAccountZoneError.unknown } try await withCheckedThrowingContinuation { continuation in
self.findOrCreateAccount { result in
switch result {
case .success(let externalID):
continuation.resume(returning: externalID)
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
private func findOrCreateAccount(completion: @escaping @Sendable (Result<String, Error>) -> Void) {
guard let database else {
completion(.failure(CloudKitAccountZoneError.unknown))
return
}
let predicate = NSPredicate(format: "isAccount = \"1\"") let predicate = NSPredicate(format: "isAccount = \"1\"")
let ckQuery = CKQuery(recordType: CloudKitContainer.recordType, predicate: predicate) let ckQuery = CKQuery(recordType: CloudKitContainer.recordType, predicate: predicate)
do { database.fetch(withQuery: ckQuery, inZoneWith: zoneID) { result in
let records = try await database.perform(ckQuery, inZoneWith: zoneID)
if records.count > 0 { switch result {
return records[0].externalID
} else { case .success((let matchResults, _)):
return try await createContainer(name: "Account", isAccount: true)
for result in matchResults {
let (_, recordResult) = result
switch recordResult {
case .success(let record):
completion(.success(record.externalID))
return
case .failure(_):
continue
}
} }
} catch { // If no records in matchResults
completion(.failure(CloudKitAccountZoneError.unknown))
case .failure(let error):
switch CloudKitZoneResult.resolve(error) { switch CloudKitZoneResult.resolve(error) {
case .retry(let timeToWait): case .retry(let timeToWait):
await delay(for: timeToWait) self.retryIfPossible(after: timeToWait) {
return try await findOrCreateAccount() self.findOrCreateAccount(completion: completion)
}
case .zoneNotFound, .userDeletedZone: case .zoneNotFound, .userDeletedZone:
_ = try await createZoneRecord() Task { @MainActor in
return try await findOrCreateAccount() _ = try await self.createZoneRecord()
self.findOrCreateAccount(completion: completion)
}
default: default:
return try await createContainer(name: "Account", isAccount: true) Task { @MainActor in
do {
let externalID = try await self.createContainer(name: "Account", isAccount: true)
completion(.success(externalID))
} catch {
completion(.failure(error))
}
}
}
} }
} }
} }