Сохранение записи CloudKit в локальный файл Сохраняет все поля, кроме CKAsset - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь сохранить массив 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 сцена), конечно, отсутствует.

Любое руководство будет оценено.

1 Ответ

0 голосов
/ 30 января 2019

CKAsset был просто ссылкой на файл.свойство fileURL CKAsset - то, где фактический файл расположен.Если вы сохраните SKAsset, то сохраните только ссылку на файл.При этом вы должны помнить, что этот URL находится в кеше, который может быть очищен, если у вас мало места.

Вы могли бы сделать 2 вещи.1. при чтении вашего резервного CKAsset, затем также проверьте, находится ли файл в расположении fileURL.Если файла нет, прочитайте его снова из CloudKit.2. Также сделайте резервную копию файла из fileURl в папку с вашими документами.Когда вы читаете свой CKAsset из своей резервной копии, то просто не читаете файл из fileURL, а место, где вы поместили его в фильтр документов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...