Pierce Pierce - 6 months ago 54
iOS Question

Save Multiple CKRecords At One Time Using CloudKit and Swift

Is it possible to save multiple

CKRecord
objects in one
CloudKit
operation using Swift? I know how to retrieve multiple records at once, using things like
CKFetchRecordsOperation
or even just a regular
performQuery
. I just realized that I am not sure of a way to save multiple new records in one operation. The way I have been doing that so far, seems inefficient to me. For example:

let recordsToSave:[CKRecord]!

for newRecord in recordsToSave {

if let database = self.publicDatabase {

database.saveRecord(newRecord, completionHandler: { (record:CKRecord?, error:NSError?) in

// Check if there was an error
if error != nil {

// There was an error, handle it properly.

}
else {

// There wasn't an error
if let savedRecord = record {

// Handle saved record accordingly.

}

}
})
}


And while that does work all fine and dandy, it seems to me as though it's extremely inefficient. I would think it would make more sense to have a specific function to call to save the entire array of
CKRecords
, instead of having to make a database call every time through the loop. Essentially here is what I'm hoping I can do:

let recordsToSave:[CKRecord]!

if let database = self.publicDatabase {

// SOMETHING HERE LIKE database.saveRECORDS (plural) ????
database.saveRecords(recordsToSave, completionHandler: { (records:[CKRecord]?, error:NSError?) in

// Check if there was an error
if error != nil {

// There was an error, handle it properly.

}
else {

// There wasn't an error
if let savedRecords = records {


}

}
})
}


As best as I can tell, and based on the information I've obtained. There isn't an actual function like
database.saveRecords
(plural). Unless I am missing something? I'm thinking that its not so cut and dry and that the naming is different, but I would assume there has to be something similar to that.

It seems so horribly inefficient to have to make a database call every time I go through the loop.

Does anybody know of a method to execute a save for multiple
CKRecords
at one time, using
CloudKit
? Any help at all would be greatly appreciated. Thank you in advance!

Answer

Using saveRecord in a loop is terribly inefficient. It's actually best to avoid all of the convenience methods on CKDatabase and use the appropriate operation.

To add/modify/delete one or more records, use CKModifyRecordsOperation. You can add/modify as well as deleted any number of records with a single operation. This will be vastly more efficient than using saveRecord.

I suggest you browse through the CloudKit Framework Reference to see the complete list of operations available.

Comments