Cloudkit support atomic save?

Viewed 31

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)
    }

0 Answers
Related