Cloudkit support atomic save??
I'd like to save multiple records like this. and I don't want to save all record if one of the record invoke the error. this code is saving partially even if there is an record has an error.
var records: [CKRecord] = []
let articleRecord = try await publicDB.record(for: article.record.recordID)
... to do something
records.append(articleRecord)
let favoriteRecord = try await publicDB.record(for: favorite.record.recordID)
...
records.append(favoriteRecord)
let pointRecord = try await publicDB.record(for: point.record.recordID)
...
records.append(pointRecord)
saveDeleteOperation(saveRecords: records, deleteRecords: []) { error in
log(error)
}
saveDeleteOperation function is like this.
public func saveDeleteOperation(saveRecords: [CKRecord], deleteRecords: [CKRecord.ID], completion: @escaping (Error?) -> Void) {
let modifyRecordsOperation = CKModifyRecordsOperation(recordsToSave: saveRecords, recordIDsToDelete: deleteRecords)
modifyRecordsOperation.isAtomic = true
modifyRecordsOperation.modifyRecordsCompletionBlock = { _, _, error in
guard error == nil else {
guard let ckerror = error as? CKError else {
completion(error)
return
}
if ckerror.code == .partialFailure {
// This is a multiple-issue error. Check the underlying array
// of errors to see if it contains a match for the error in question.
guard let errors = ckerror.partialErrorsByItemID else {
completion(error)
return
}
for (_, error) in errors {
if let currentError = error as? CKError {
if currentError.code == CKError.zoneNotFound {
log("zoneNotFound")
return
}
}
}
}
completion(error)
return
}
// The record has been saved without errors
completion(nil)
}
self.publicDB.add(modifyRecordsOperation)
}