CKQuery Perform выбирает только записи, созданные до запуска приложения - PullRequest
0 голосов
/ 28 августа 2018

У меня есть приложения для iOS и macOS, над которыми я работаю. С помощью приложения iOS пользователь отправляет данные в iCloud Drive, в то время как они используют аналог MacOS для получения данных. Следующие строки кода взяты из приложения macOS.

func completionPopulateDataFromCloud(uuid: String ,completionHandler: @escaping (Bool) -> (Void)) -> Void {
    DispatchQueue.global().async() {
        // Start Process //
        let cloudContainer = CKContainer(identifier: "whatever...")
        let privateDB = cloudContainer.privateCloudDatabase
        let predicate = NSPredicate(format: "uuid = %@", uuid)
        let query = CKQuery(recordType: "myRecords", predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
        privateDB.perform(query, inZoneWith: nil) { records, error in
            guard let records = records else {
                completionHandler(false)
                return
            }

            DispatchQueue.main.async() {
                [weak self] in
                guard let strongSelf = self else { return }

                if records.count == 0 {
                } else {
                    let record = records[0]
                    let recordID = record.recordID.recordName
                    ...
                    ...
                    completionHandler(true)
                }
            }
        }
    }
}

Так что я просто сортирую количество записей по дате и получаю последнюю запись вместо получения всех записей.

Дело в том, что приложение не будет получать записи, которые были загружены на iCloud Drive после запуска приложения. Даже если я подожду несколько минут, приложение не получит самую последнюю версию. Если я закрою приложение, а затем перезапущу его, оно получит самое последнее. Это то, как все должно работать? Надеюсь нет. Есть какой-то трюк, о котором я не знаю? Спасибо.

p.s. Я прочитал эту тему . Я не думаю, что это связано с моим.

1 Ответ

0 голосов
/ 28 августа 2018

Обычным способом является использование пользовательской зоны записи. Создайте CKRecordZoneSubscription и извлеките изменения с помощью CKFetchRecordZoneChangesOperation при запуске приложения. Обработайте и сохраните CKServerChangeToken, чтобы сохранить текущее состояние.

Во время работы приложения вы получаете уведомления с помощью push-уведомлений об изменениях.

Пожалуйста, смотрите видео WWDC о CloudKit для получения дополнительной информации.

...