为什么我在 iOS 中的日期组件对象无法正确保存到 CloudKit 或从 CloudKit 检索



我正在使用 CloudKit 和 Swift for iOS。

我正在将类型为日期组件的对象保存在字节类型的 CloudKit 字段中。当我检索对象时,它与我最初保存的对象的值不同。

以下是我将对象保存到 CloudKit 的代码:

let unsafePointer: UnsafePointer<DateComponents> = UnsafePointer<DateComponents>(&time)
let unsafeBufferPointer: UnsafeBufferPointer<DateComponents> = UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)
let data: Data = Data(buffer: unsafeBufferPointer)
privateRecord.setObject(data as CKRecordValue?, forKey: DatabaseNameStrings.fieldTime)

以下是调试窗口中的打印结果:

时间 = 日历:公历(自动更新当前( 时区:美国/芝加哥(自动更新当前( 小时:12 分钟:0 是闰月:假

这是我从CloudKit检索对象的代码:

if let dataTime = privateRecord.object(forKey: DatabaseNameStrings.fieldTime) as? Data {
    let unsafeMutableBufferPointer: UnsafeMutableBufferPointer<DateComponents> = UnsafeMutableBufferPointer<DateComponents>.allocate(capacity: 1)
    _ = dataTime.copyBytes(to: unsafeMutableBufferPointer)
    print("unsafeMutableBufferPointer.first =", unsafeMutableBufferPointer.first as Any)
    privateTime = unsafeMutableBufferPointer.first
}

以下是调试窗口中的打印结果:

unsafeMutableBufferPointer.first = 可选(era

: 0 年: 0 个月: 0 天: 0 小时: 0 分钟: 0 秒: 0 纳秒: 0 工作日: 0 工作日序数: 0 季度: 0 周的月份: 0 周的一年: 0 年为周的一年: 0 是闰月: 假(

尝试保留DateComponents实例是错误的方法;您无法看到对象的内部结构,并且此结构可能会随着 Swift 或 iOS 更新而更改。

您的假设是,只需恢复表示其他实例的字节即可绕过DateComponents的初始化;这是一个不正确的假设。

DateComponents实际上是免费桥接到NSDateComponents的基础实例的。

调用UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)时,您正在访问用于访问底层NSDateComponents实例的 Swift 结构。

当您随后尝试重新创建此结构时,该基础对象不存在,并且您得到 0。

您应该保存重新创建日期组件所需的特定字段(例如时区、小时等(或保存Date对象。

相关内容

  • 没有找到相关文章

最新更新