2015-07-18 4 views
0

Мне нужно экспортировать данные из словаря из 12 тысяч предметов в Cloudkit. Я попытался использовать удобный API, но я продолжаю использовать ограничение скорости при попытке сохранить в публичной базе данных. Затем я попробовал API-интерфейс операции, и я получил аналогичную ошибку. Мой вопрос: как сэкономить очень большой объем данных для облачного без ущерба для пределов?Экспорт записей в cloudkit

ответ

1

Согласно документации для кода CKErrorLimitExceeded ошибок, вы должны

Попробуйте рефакторинга ваш запрос на несколько небольших партий.

Так что, если ваши CKModifyRecordsOperation результаты работы в ошибке CKErrorLimitExceeded, вы можете просто создать два CKModifyRecordsOperation объектов, каждый из которых половины данных из провалившейся операции. Если вы сделаете это рекурсивно (так что любая из операций разделения может также потерпеть неудачу с превышением предела превышения, разделить снова на два), тогда вы должны в конечном итоге получить несколько объектов CKModifyRecordsOperation, которые имеют достаточно небольшое количество записей, чтобы избежать ошибки.

+0

Знаете ли вы достаточно небольшое количество? – malhal

+0

Да, запоздалый ответ; но хороший вопрос. Ваш лучший выбор и наиболее эффективное средство - использовать Активы. Сохраните все свои данные в большой объем данных и сохраните их в качестве актива. – user3069232

+0

Лучше не использовать фиксированное «достаточно маленькое количество», поскольку оно может измениться в последующих версиях iOS –

0

В прошивкой 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 
} 
Смежные вопросы