Я пытаюсь сохранить массив CKRecords в каталог документов в
Для быстрого запуска и автономного доступа.
Загрузка CKRecords из CloudKit работает нормально, и я могу без проблем использовать CKAsset в каждой записи. Однако при сохранении загруженного массива CKRecords в локальный файл набор CKA не включается в файл данных. Я могу сказать это по размеру файла, сохраненного в каталоге документов. Если я восстанавливаю файл диска в массив CKRecords, я могу получить все поля, кроме CKAsset. За исключением системных полей и поля CKAsset, все поля являются строками.
Для тестирования - у меня есть 10 записей CloudKit, каждая с шестью небольшими полями String.
и CKAsset, который составляет около 500 КБ. Когда я проверяю размер
Полученный файл в документах имеет размер файла около 15 КБ.
Вот функция сохранения массива. AppDelegate.ckStyleRecords является
статический массив загруженных CKRecords.
func saveCKStyleRecordsToDisk() {
if AppDelegate.ckStyleRecords.count != 0 {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docsDirectoryURL = urls[0]
let ckStyleURL = docsDirectoryURL.appendingPathComponent("ckstylerecords.data")
do {
let data : Data = try NSKeyedArchiver.archivedData(withRootObject: AppDelegate.ckStyleRecords, requiringSecureCoding: true)
try data.write(to: ckStyleURL, options: .atomic)
print("data write ckStyleRecords successful")
} catch {
print("could not save ckStyleRecords to documents directory")
}
}//if count not 0
}//saveCKStyleRecordsToDisk
Вот функция восстановления массива.
func checkForExistenceOfCKStyleRecordsInDocuments(completion: @escaping ([CKRecord]) -> Void) {
let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docsDirectoryURL = urls[0]
let ckStyleURL = docsDirectoryURL.appendingPathComponent("ckstylerecords.data")
var newRecords : [CKRecord] = []
if FileManager.default.fileExists(atPath: ckStyleURL.path) {
do {
let data = try Data(contentsOf:ckStyleURL)
//yes, I know this has been deprecated, but I can't seem to get the new format to work
if let theRecords: [CKRecord] = try NSKeyedUnarchiver.unarchiveObject(with: data) as? [CKRecord] {
newRecords = theRecords
print("newRecords.count is \(newRecords.count)")
}
} catch {
print("could not retrieve ckStyleRecords from documents directory")
}
}//if exists
completion(newRecords)
}//checkForExistenceOfckStyleRecordsInDocuments
Вызов выше:
kAppDelegate.checkForExistenceOfCKStyleRecordsInDocuments { (records) in
print("in button press and records.count is \(records.count)")
//this is just for test
for record in records {
print(record.recordID.recordName)
}
AppDelegate.ckStyleRecords = records
}//completion block
При обновлении tableView, использующего массив ckStyleRecords, все данные
кажется правильным, за исключением CKAsset (который в данном случае является SceneKit
сцена), конечно, отсутствует.
Любое руководство будет оценено.