Почему мой объект DateComponents в iOS неправильно сохраняется или извлекается из CloudKit? - PullRequest
1 голос
/ 12 июля 2019

Я использую CloudKit с Swift для iOS.

Я сохраняю объект типа DateComponents в поле CloudKit типа Bytes.Когда я получаю объект, он не имеет того же значения, что и объект, который я первоначально сохранил.

Вот код, в котором я сохраняю объект в 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 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
}

Вот результат печати в окне отладки:

unsafeMutableBufferPointer.first = Необязательно (эпоха: 0 год: 0 месяц: 0 день: 0 час: 0 минута: 0 секунда: 0 наносекунда: 0 день недели: 0 день неделиOrdinal: 0 квартал: 0 weekOfMonth: 0 weekOfYear: 0 yearForWeekOfYear: 0 isLeapMonth: false)

1 Ответ

1 голос
/ 12 июля 2019

Попытка сохранить экземпляр DateComponents - неправильный подход; Вы не видите внутреннюю структуру объекта, и эта структура может измениться с обновлениями Swift или iOS.

Вы предполагаете, что вы можете обойти инициализацию DateComponents, просто восстановив байты, которые представляли какой-то другой экземпляр; Это неверное предположение.

DateComponents на самом деле бесплатен и соединен с базовым экземпляром NSDateComponents.

Когда вы вызываете UnsafeBufferPointer<DateComponents>(start: unsafePointer, count: 1), вы получаете доступ к структуре Swift, которая используется для доступа к базовому экземпляру NSDateComponents.

Когда вы впоследствии попытаетесь воссоздать эту структуру, этот базовый объект не существует, и вы получите 0.

Вам следует либо сохранить определенные поля, необходимые для воссоздания компонентов даты (например, часовой пояс, часы и т. Д.), Либо сохранить объект Date.

...