CKQuery Perform 仅获取在应用程序启动之前创建的记录
Posted
技术标签:
【中文标题】CKQuery Perform 仅获取在应用程序启动之前创建的记录【英文标题】:CKQuery Perform Only Fetches Records That Are Created Before Application Is Launched 【发布时间】:2018-08-28 12:50:33 【问题描述】:我一直在开发 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 的记录。即使我等待几分钟,该应用程序也不会获得最新的。如果我退出应用程序然后重新启动它,它将获得最新的。这就是事情应该如何运作的方式吗?我希望不是。有什么我不知道的技巧吗?谢谢。
附言我读过this topic。我认为这与我无关。
【问题讨论】:
【参考方案1】:通常的方法是使用自定义记录区。创建一个CKRecordZoneSubscription
并在应用程序启动时使用CKFetchRecordZoneChangesOperation
获取更改。处理并保存CKServerChangeToken
以保持当前状态。
当应用程序运行时,您会收到有关更改的推送通知。
请观看有关 CloudKit 的 WWDC 视频了解更多信息。
【讨论】:
以上是关于CKQuery Perform 仅获取在应用程序启动之前创建的记录的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用“IN”谓词进行 ckQuery?