- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有几个可编码的结构,我想创建一个通用协议(protocol)来将它们编码为 CloudKit 的 CKRecord 并解码回来。
我有一个用于创建字典的 Encodable 扩展:
extension Encodable {
var dictionary: [String: Any] {
return (try? JSONSerialization.jsonObject(with: JSONEncoder().encode(self), options: .allowFragments)) as? [String: Any] ?? [:]
}
}
然后在协议(protocol)扩展中,我将记录创建为属性,如果类型是数据,我会尝试创建一个 CKAsset。
var ckEncoded: CKRecord? {
// Convert self.id to CKRecord.name (CKRecordID)
guard let idString = self.id?.uuidString else { return nil }
let record = CKRecord(recordType: Self.entityType.rawValue,
recordID: CKRecordID(recordName: idString))
self.dictionary.forEach {
if let data = $0.value as? Data {
if let asset: CKAsset = try? ckAsset(from: data, id: idString) { record[$0.key] = asset }
} else {
record[$0.key] = $0.value as? CKRecordValue
}
}
return record
}
解码:
func decode(_ ckRecord: CKRecord) throws {
let keyIntersection = Set(self.dtoEncoded.dictionary.keys).intersection(ckRecord.allKeys())
var dictionary: [String: Any?] = [:]
keyIntersection.forEach {
if let asset = ckRecord[$0] as? CKAsset {
dictionary[$0] = try? self.data(from: asset)
} else {
dictionary[$0] = ckRecord[$0]
}
}
guard let data = try? JSONSerialization.data(withJSONObject: dictionary) else { throw Errors.LocalData.isCorrupted }
guard let dto = try? JSONDecoder().decode(self.DTO, from: data) else { throw Errors.LocalData.isCorrupted }
do { try decode(dto) }
catch { throw error }
}
除数据类型外,一切都来回运作。字典里查不出来。所以,我无法将其转换为 CKAsset。提前谢谢你。
最佳答案
我还发现到目前为止,Apple 还没有对此提供明确的支持。
我的解决方案是手动编码/解码:在我的 Codable 子类上我添加了两个方法:
/// Returns CKRecord
func ckRecord() -> CKRecord {
let record = CKRecord(recordType: "MyClassType")
record["title"] = title as CKRecordValue
record["color"] = color as CKRecordValue
return record
}
init(withRecord record: CKRecord) {
title = record["title"] as? String ?? ""
color = record["color"] as? String ?? kDefaultColor
}
另一种针对更复杂情况的解决方案是使用一些第 3 方库,我遇到的一个是:https://github.com/insidegui/CloudKitCodable
关于swift - 可编码为 CKRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47948924/
我想像文档显示那样使用下标运算符:myRecord[@"firstName"] = @"Jacob"; 但无法让它在 Swift 中工作。 知道为什么吗? 最佳答案 在这篇文章中,您可以看到为什么订阅
我写了下面的代码来共享一个 CKRecord: CKRecordZone *restaurantsZone = [[CKRecordZone alloc] initWithZoneName:@"Res
在公共(public)数据库上查询: let pred = NSPredicate(format: "family == %@", ref) let query = CKQuery(recordTyp
假设我在私有(private) CloudKit 数据库中有 A 类型的记录。如何在不指定记录 ID 或查询谓词的情况下获取该类型的 ALL 记录? 最佳答案 CKQuery 在初始化时需要一个非 n
如何在客户端以编程方式从我的数据库中删除 CKRecord。 for record in records { if recordNumber 13 { // DELETE R
我无法保存已保存的记录。 recordToSave 是从服务器下载的 CKRecord。可以更新吗? recordTosave.setValue("cat", forKey: "animal") le
我正在尝试根据用户的用户名获取用户的值。我能够使用以下方法获得正确的用户: class func getByUsername(username: String, callback: (records:
我有几个可编码的结构,我想创建一个通用协议(protocol)来将它们编码为 CloudKit 的 CKRecord 并解码回来。 我有一个用于创建字典的 Encodable 扩展: extensio
所以我遇到了一个非常奇怪的问题,我想我要么不了解 CloudKit 在后台是如何工作的,要么我在 CloudKit 中遇到了一个错误。 所以,问题看起来像这样: 应用初始状态: 我有 5 条“包裹”记
我需要迁移记录,因为“CKFetchRecordChangesOperation”不适用于默认记录。我应该一个一个地迁移它还是有什么方法可以自动迁移? 最佳答案 是的,需要一项一项的完成。您需要从旧区
在我的应用程序中,我有数百个电影对象作为CKRecord,在检索它们后将其放入数组中。例如,我希望有一种方法来检查数组是否包含标题为“泰坦尼克号”的电影记录。 到目前为止我所做的就是像这样循环数组:
因此,我正在创建一个将大量重复使用某些记录的应用程序,因此我想出了一个想法: import CloudKit class Class: CKRecord { override init
我所做的就是: if let id = record.lastModifiedUserRecordID { publicDatabase.fetch(withRecordID: id) { r
我使用以下代码在自定义私有(private) CKRecordZone 中创建 CKRecord: let noteZoneID = CKRecordZone.ID(zoneName: CloudKi
有没有办法从CKRecord中删除对象/键?它在某种程度上就像一个 NSDictionary ,但我相信没有可用的方法来完成这项任务。与 NSDictionary 不同,我们有 - (void)rem
我有一个自定义类,我用它制作了一个 (swift-y) 结构 NSCodable。现在我想将其转换为 CKRecord 以便使用 CloudKit。尽管我在对我的结构进行编码时设置了“键值”对,但据我
我认为将包含信息的基本数据对象定义为 CKRecord 可能是个好主意,因为我显然会使用 CloudKit。但是,我不知道如何创建一个 CKRecord 类。特别是,我不知道如何定义它的“record
我正在尝试在 CKRecord 上设置父项。基本上,提醒是列表的子项。该列表已存在于服务器上。 let record = CKRecord(recordType: "Reminder", record
我目前正在开发一个 iPhone 应用程序,它利用 CloudKit 在用户设备之间同步应用程序数据。我使用 CoreData 作为我的本地缓存,以确保该应用在设备离线时仍然可用。 问题 在开发过程中
我正在寻找保存 CKRecord 时正确处理错误的示例。根据Apple docs我应该“使用错误对象中的信息来确定问题是否有解决方法。” 我知道错误对象有一个 userInfo 字典,但我如何找出字典
我是一名优秀的程序员,十分优秀!