Я пытаюсь реализовать синхронизацию CloudKit.Я получаю удаленное уведомление об измененных данных через
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
{
let notification = CKNotification(fromRemoteNotificationDictionary: userInfo)
print (notification)
let bgid = application.beginBackgroundTask {
print ("backgroundtaskhandler called")
}
print (application.backgroundTimeRemaining)
CKManager.ckmanager.handleNotification(bgid: bgid) { (id) in
application.endBackgroundTask(id)
completionHandler(.newData)
}
}
. Как я понимаю,
CKManager.ckmanager.handleNotification()
в вышеприведенном коде есть только около 30 секунд для выполнения, прежде чем япридется вызывать обработчик завершения, иначе приложение завершит работу.
Теперь я ожидаю, что выборка и обработка новых записей иногда занимают больше времени, чем разрешено.Я не уверен, как это обработать.
Если бы это была операция обновления в CKRecords, я мог бы использовать флаг isLongLived
этой операции, но я не вижу, как это будет работать с операцией выборки.
С помощью функции «handleNotification» я вызываю делегата для обработки изменений записи (записи его в локальную базу данных SQL):
let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zoneID!], optionsByRecordZoneID: optionsMap)
operation.fetchAllChanges = true
operation.recordChangedBlock =
{ record in
self.delegate?.cloudKitRecordChanged(record: record
}
Может кто-нибудь настроить меня на правильный путь?