Это iCloud или это мой код?

Я использую слегка обновленный код этого вопроса: Метод для загрузки файлов iCloud? Очень запутанно?

Вот выдержка из кода:

private func downloadUbiquitiousItem(atURL url: URL) -> Void {
        do {
            try FileManager.default.startDownloadingUbiquitousItem(at: url)
            do {
                let attributes = try url.resourceValues(forKeys: [URLResourceKey.ubiquitousItemDownloadingStatusKey])
                if let status: URLUbiquitousItemDownloadingStatus = attributes.allValues[URLResourceKey.ubiquitousItemDownloadingStatusKey] as? URLUbiquitousItemDownloadingStatus {
                    if status == URLUbiquitousItemDownloadingStatus.current {
                        self.processDocument(withURL: url)
                        return
                    } else if status == URLUbiquitousItemDownloadingStatus.downloaded {
                        self.processDocument(withURL: url)
                        return
                    } else if status == URLUbiquitousItemDownloadingStatus.notDownloaded {
                        do {
                            //will go just fine, if it is unnecessary to download again
                            try FileManager.default.startDownloadingUbiquitousItem(at: url)
                        } catch {
                            return
                        }
                    }
                }
            } catch {

            }

            //only happens if the try does not fail
            self.documentsQuery = NSMetadataQuery()
            self.documentsQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
            self.documentsQuery.valueListAttributes = [NSMetadataUbiquitousItemPercentDownloadedKey,NSMetadataUbiquitousItemDownloadingStatusKey]
            self.documentsQuery.predicate = NSPredicate(format: "%K like 'backup.json'", argumentArray: [NSMetadataItemFSNameKey])

            NotificationCenter.default.addObserver(self, selector: #selector(self.queryUpdate(notification:)), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: self.documentsQuery)

            DispatchQueue.main.async {
                if self.documentsQuery.start() {
                    if self.restoreHUD != nil {
                        self.restoreHUD.show(animated: true)
                        //timeout for restoring
                        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(30), execute: { 
                            if self.restoreHUD != nil {
                                self.restoreHUD.hide(animated: true)
                            }
                        })
                    }
                }
            }
        } catch {
            //file does not exist in icloud most likely
        }
    }

Так что иногда это работает, но это действительно нестабильно, например, мы тестировали следующие случаи:

  1. Резервное копирование в iCloud
  2. Убедитесь, что у нас есть действительный документ в настройках -> iCloud -> Хранилище -> Управление хранилищем -> MyApp -> backup.json
  3. Принудительно запустите первый запуск, чтобы приложение восстановило файл backup.json (он же выполняет приведенный выше код)

Это иногда работает, а иногда нет. Иногда запрос не обновляется.

Мы также протестировали следующий сценарий:

  1. Удалить резервную копию из iCloud вручную через настройки
  2. Удалите приложение и переустановите его, чтобы обеспечить первый запуск
  3. startDownloadingUbiquitousItem Функция, похоже, не выдает, даже если в iCloud ничего нет, потому что я думаю, что iCloud все еще не синхронизировал локальный файл и не удалил локальные данные, но также не загружает должным образом... пока статус не загружен.

Может быть, пользователи не должны стереть вещи через настройки? Я хотел бы знать, если в моем коде отсутствует случай, который может произойти, или этот API просто очень неудобен для разработчиков...

Спасибо!

1 ответ

Возможно, мы призываем к добавлению уведомления в "основной ветке".

NotificationCenter.default.addObserver(self, selector: #selector(self.queryUpdate(notification:)), name: NSNotification.Name.NSMetadataQueryDidUpdate, object: self.documentsQuery)
Другие вопросы по тегам