首页 > 解决方案 > CKQuery Perform 仅获取在应用程序启动之前创建的记录

问题描述

我有我一直在研究的 iOS 和 macOS 应用程序。使用 iOS 应用程序,用户在使用 macOS 应用程序接收数据时将数据发送到 iCloud Drive。以下代码行来自 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 的记录。即使我等了几分钟,应用程序也不会得到最新的。如果我退出应用程序然后重新启动它,它将获得最新的。事情是这样运作的吗?我希望不是。有什么我不知道的技巧吗?谢谢。

ps 我读过这个话题。我不认为这与我的有关。

标签: iosswiftmacoscloudkitckquery

解决方案


通常的方法是使用自定义记录区域。创建一个CKRecordZoneSubscriptionCKFetchRecordZoneChangesOperation在应用程序启动时获取更改。处理并保存CKServerChangeToken以保持当前状态。

在应用程序运行时,您会收到有关更改的推送通知。

请观看有关 CloudKit 的 WWDC 视频以获取更多信息。


推荐阅读