Операции CloudKit выполняются в версии для разработки, но иногда зависают в рабочей версии

Я делаю вызовы в базу данных iCloud двумя разными способами в моем приложении:

1. Вызов CKDatabase Удобный метод отлично работает в среде разработки (симулятор) и производства (устройство):

let privateDatabase = CKContainer.defaultContainer().privateCloudDatabase

privateDatabase.fetchRecordWithID(recordID, completionHandler: { (record, error) -> Void in
    // handle record and errors
})

2. Добавление CKOperations к основной очереди отлично работает в среде разработки и работает некоторое время, когда я тестирую в производственной среде - но затем произвольно, после нескольких часов прерывистого тестирования, этот вызов базы данных просто начинает зависать - никаких ошибок не возникает, и код завершения не выполняется. (The fetchRecordWithID звонок все равно работает отлично все время.)

let op1 = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: nil)
op1.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) -> Void in
    // handle records and errors
    }
op1.database = privateDatabase

// let op2, op3...

NSOperationQueue.mainQueue().addOperations([
    op1,
    op2,
    op3,
    ], waitUntilFinished: false)

На панели "Использование" в панели управления CloudKit ничто даже близко не приближается к пределу. Какие другие переменные я не рассматриваю - или какие другие тесты я могу запустить, чтобы выяснить, что происходит не так?

1 ответ

Решение

Попробуйте установить op1, op2 и op3.qualityOfService = .UserInitiated

Эта настройка была установлена ​​на "более низкое" стандартное значение в iOS 9.

Документация гласит для qualityOfService:

Относительная важность для предоставления системных ресурсов для операции. Уровни обслуживания влияют на приоритет, с которым операционному объекту предоставляется доступ к системным ресурсам, таким как время процессора, сетевые ресурсы, дисковые ресурсы и т. Д. Операции с более высоким качеством обслуживания получают больший приоритет над системными ресурсами, чтобы они могли выполнять свои задачи быстрее. Вы используете уровни обслуживания, чтобы гарантировать, что операции, отвечающие на явные запросы пользователей, имеют приоритет над менее критичной работой. Это свойство отражает минимальный уровень обслуживания, необходимый для эффективного выполнения операции. Значение по умолчанию этого свойства NSOperationQualityOfServiceBackground и вы должны оставить это значение на месте, когда это возможно. При изменении уровня обслуживания используйте минимальный уровень, подходящий для выполнения соответствующей задачи. Например, если пользователь инициирует задачу и ожидает ее завершения, присвойте значение NSOperationQualityOfServiceUserInitiated к этой собственности. Система может предоставить операции более высокий уровень обслуживания для операции, если для этого доступны ресурсы.

Другие вопросы по тегам