为什么我在 iOS 中的 DateComponents 对象不能正确地保存到 CloudKit 或从中检索?
Why does my DateComponents object in iOS not save to or retrieve from CloudKit correctly?
我正在使用 CloudKit 和 Swift 用于 iOS。
我正在将 DateComponents 类型的对象保存在字节类型的 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)
这里是调试中的打印结果window:
time = calendar: gregorian (autoupdatingCurrent) timeZone: America/Chicago (autoupdatingCurrent) hour: 12 minute: 0 isLeapMonth: false
这是我从 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
}
这里是调试中的打印结果window:
unsafeMutableBufferPointer.first = Optional(era: 0 year: 0 month: 0 day: 0 hour: 0 minute: 0 second: 0 nanosecond: 0 weekday: 0 weekdayOrdinal: 0 quarter: 0 weekOfMonth: 0 weekOfYear: 0 yearForWeekOfYear: 0 isLeapMonth: false )
试图持久化 DateComponents
实例是错误的做法;您看不到对象的内部结构,并且此结构可能会随着 Swift 或 iOS 更新而改变。
你的假设是你可以简单地通过恢复代表其他实例的字节来绕过 DateComponents
的初始化;这是一个错误的假设。
DateComponents
实际上是 toll-free 桥接到 NSDateComponents
.
的基础实例
当您调用 UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)
时,您正在访问用于访问基础 NSDateComponents
实例的 Swift 结构。
当您随后尝试 re-create 此结构时,该基础对象不存在并且您得到 0。
您应该保存 re-create 日期组成部分(例如时区、小时等)所需的特定字段,或者保存 Date
对象。
我正在使用 CloudKit 和 Swift 用于 iOS。
我正在将 DateComponents 类型的对象保存在字节类型的 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)
这里是调试中的打印结果window:
time = calendar: gregorian (autoupdatingCurrent) timeZone: America/Chicago (autoupdatingCurrent) hour: 12 minute: 0 isLeapMonth: false
这是我从 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
}
这里是调试中的打印结果window:
unsafeMutableBufferPointer.first = Optional(era: 0 year: 0 month: 0 day: 0 hour: 0 minute: 0 second: 0 nanosecond: 0 weekday: 0 weekdayOrdinal: 0 quarter: 0 weekOfMonth: 0 weekOfYear: 0 yearForWeekOfYear: 0 isLeapMonth: false )
试图持久化 DateComponents
实例是错误的做法;您看不到对象的内部结构,并且此结构可能会随着 Swift 或 iOS 更新而改变。
你的假设是你可以简单地通过恢复代表其他实例的字节来绕过 DateComponents
的初始化;这是一个错误的假设。
DateComponents
实际上是 toll-free 桥接到 NSDateComponents
.
当您调用 UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1)
时,您正在访问用于访问基础 NSDateComponents
实例的 Swift 结构。
当您随后尝试 re-create 此结构时,该基础对象不存在并且您得到 0。
您应该保存 re-create 日期组成部分(例如时区、小时等)所需的特定字段,或者保存 Date
对象。