Мне нужно экспортировать данные из словаря из 12 тысяч предметов в Cloudkit. Я попытался использовать удобный API, но я продолжаю использовать ограничение скорости при попытке сохранить в публичной базе данных. Затем я попробовал API-интерфейс операции, и я получил аналогичную ошибку. Мой вопрос: как сэкономить очень большой объем данных для облачного без ущерба для пределов?Экспорт записей в cloudkit
ответ
Согласно документации для кода CKErrorLimitExceeded
ошибок, вы должны
Попробуйте рефакторинга ваш запрос на несколько небольших партий.
Так что, если ваши CKModifyRecordsOperation
результаты работы в ошибке CKErrorLimitExceeded
, вы можете просто создать два CKModifyRecordsOperation
объектов, каждый из которых половины данных из провалившейся операции. Если вы сделаете это рекурсивно (так что любая из операций разделения может также потерпеть неудачу с превышением предела превышения, разделить снова на два), тогда вы должны в конечном итоге получить несколько объектов CKModifyRecordsOperation
, которые имеют достаточно небольшое количество записей, чтобы избежать ошибки.
Если у вас есть собственный сервер, вы можете попробовать API CloudKit Web Service.
В прошивкой 10, максимально допустимое количество записей в операции 400.
/// The system allowed maximum record modifications count.
///
/// If excute a CKModifyRecordsOperation with more than 400 record modifications, system will return a CKErrorLimitExceeded error.
private let maximumRecordModificationsLimit = 400
private func modifyRecords(recordsToSave: [CKRecord], recordIDsToDelete: [CKRecordID], previousRetryAfterSeconds: TimeInterval = 0, completion: ((Bool) -> Void)? = nil) {
guard !recordsToSave.isEmpty || !recordIDsToDelete.isEmpty else {
completion?(true)
return
}
func handleLimitExceeded() {
let recordsToSaveFirstSplit = recordsToSave[0 ..< recordsToSave.count/2]
let recordsToSaveSecondSplit = recordsToSave[recordsToSave.count/2 ..< recordsToSave.count]
let recordIDsToDeleteFirstSplit = recordIDsToDelete[0 ..< recordIDsToDelete.count/2]
let recordIDsToDeleteSecondSplit = recordIDsToDelete[recordIDsToDelete.count/2 ..< recordIDsToDelete.count]
self.modifyRecords(recordsToSave: Array(recordsToSaveFirstSplit), recordIDsToDelete: Array(recordIDsToDeleteFirstSplit))
self.modifyRecords(recordsToSave: Array(recordsToSaveSecondSplit), recordIDsToDelete: Array(recordIDsToDeleteSecondSplit), completion: completion)
}
if recordsToSave.count + recordIDsToDelete.count > maximumRecordModificationsLimit {
handleLimitExceeded()
return
}
// run CKModifyRecordsOperation at here
}
Знаете ли вы достаточно небольшое количество? – malhal
Да, запоздалый ответ; но хороший вопрос. Ваш лучший выбор и наиболее эффективное средство - использовать Активы. Сохраните все свои данные в большой объем данных и сохраните их в качестве актива. – user3069232
Лучше не использовать фиксированное «достаточно маленькое количество», поскольку оно может измениться в последующих версиях iOS –