ios - 无法使用 cloudkit 从公共数据库中获取记录
问题描述
这是我用来获取公共记录的方法:
private func fetchPublicRecordZonesChanges(completion: ErrorHandler?) {
let zone = CKRecordZone.default()
let options = CKFetchRecordZoneChangesOptions()
options.previousServerChangeToken = nil
var records = [CKRecord]()
var recordIDsToDelete = [CKRecordID]()
let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [zone.zoneID], optionsByRecordZoneID: [zone.zoneID: options])
operation.database = CloudAssistant.shared.publicDatabase
operation.recordChangedBlock = { record in
records.append(record)
}
operation.recordWithIDWasDeletedBlock = { recordID, string in
recordIDsToDelete.append(recordID)
}
operation.recordZoneChangeTokensUpdatedBlock = { _, token, _ in
if let token = token {
Token.temporaryPublicZoneServerChangeToken = token
}
}
operation.recordZoneFetchCompletionBlock = { [weak self] _, token, _, _, error in
if let error = error, error.isTokenExpiredError {
UserDefaults.remove(forKey: PublicZoneServerChangeTokenKey)
self?.fetchPublicRecordZonesChanges(completion: completion)
return
}
if let token = token {
Token.temporaryPublicZoneServerChangeToken = token
}
}
operation.fetchRecordZoneChangesCompletionBlock = { [weak self] error in
self?.save(records: records, recordIDsToDelete: recordIDsToDelete) { error in
completion?(error)
}
}
operationQueue.addOperation(operation)
}
但是,尽管调用了该方法,但没有获取任何内容,甚至recordChangedBlock
在调用闭包时也没有获取任何内容。为什么?
我很确定我在那里有记录:
而且环境也很好,因为私有开发记录被正确获取(当然使用不同的方法)。我究竟做错了什么?
解决方案
要收到公共数据库更改的通知,请CKQuerySubscription
为您关心的记录类型创建一个。这是一个例子:
let subscription = CKQuerySubscription(
recordType: "Question",
predicate: NSPredicate(value: true),
subscriptionID: "subscriptionQuestion",
options: [
.firesOnRecordCreation,
.firesOnRecordUpdate,
.firesOnRecordDeletion
])
let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
subscription.notificationInfo = info
let operation = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: nil)
operation.modifySubscriptionsCompletionBlock = { saved, deleted, error in
if let error = error{
print("Add subscription error: \(error)")
}else{
print("Successfully added Question subscription.")
}
}
//:::
let container = CKContainer(identifier: "...")
container.publicCloudDatabase.add(operation)
推荐阅读
- google-apps-script - 谷歌表格和谷歌分析认证
- java - 有什么方法可以将字符串 [这是某个类的对象] 转换为某个类的对象吗?
- angular - Angular 2+:将垫子分成两页
- cube - ESSBASE 运行时间长
- spring - Thymeleaf/Spring:如何检查消息属性是否存在
- http - Angular 5 - Http拦截器和行为主题问题
- c# - Aspx 表单不会将数据传递给文件后面的代码
- ios - iOS 何时引入 libc++?
- java - 为 JBOSS eap 7.1 配置 HTTP 查询长度
- c# - 使用查询的索引在 linq select 语句中填充列表