ios - 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 我读过这个话题。我不认为这与我的有关。
解决方案
通常的方法是使用自定义记录区域。创建一个CKRecordZoneSubscription
并CKFetchRecordZoneChangesOperation
在应用程序启动时获取更改。处理并保存CKServerChangeToken
以保持当前状态。
在应用程序运行时,您会收到有关更改的推送通知。
请观看有关 CloudKit 的 WWDC 视频以获取更多信息。
推荐阅读
- html - 为什么我的导航栏将我的文本隐藏在固定位置?
- c - 使用 math.h 从命令行 gcc 编译 C 程序的问题
- robots.txt - 如何从 robots.txt 文件中排除 URL
- regex - 正则表达式:匹配模式和捕获组 0 或 1 次
- ruby-on-rails - 从外部页面发送表单数据时如何解决 Rails 中的无效真实性令牌错误
- excel - 使用命名范围触发 Worksheet_Change 事件导致 1004 错误
- angularjs - 如何使指令使用指令属性中指定的控制器?
- python - 创建带有循环的json文件以获取工件列表python
- sql - 如何在一个查询SQL中更新一列中的多行
- c - 如何在C中获取子进程PID