我有正在使用的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的记录。即使我等了几分钟,该应用程序也无法获得最新版本。如果我退出该应用程序,然后再次重新启动它,它将获得最新的信息。那是应该如何运作的吗?我希望不是。有一些我不知道的把戏吗?谢谢。
p.s。我已经读过this topic。我认为这与我无关。
答案 0 :(得分:1)
通常的方法是使用自定义记录区。创建一个CKRecordZoneSubscription
,并在应用程序启动时使用CKFetchRecordZoneChangesOperation
获取更改。处理并保存CKServerChangeToken
以维持当前状态。
应用程序正在运行时,您会收到有关更改的推送通知。
请观看有关CloudKit的WWDC视频以获取更多信息。