Как мне написать код, который копирует файл в iOS из песочницы в контейнер iCloud? - PullRequest
0 голосов
/ 17 сентября 2018

Я заметил, что в примере Apple ShapeEdit код, который копирует шаблон файла в контейнер iCloud, не использует файловые презентаторы, но использует NSFileCordinator.Это почему?Я думал, что любая файловая операция с использованием iCloud требует использования бота NSFileCoordinator и объектов, которые используют протокол NSFilePresenter.Я также заметил, что они используют copyItem вместо setUbiquitous, как я и предполагал.

Если этот код неверен, как мне написать правильный код?

fileprivate func createNewDocumentWithTemplate(_ templateURL: URL) {
    /*
        We don't create a new document on the main queue because the call to
        fileManager.URLForUbiquityContainerIdentifier could potentially block
    */
    coordinationQueue.addOperation {
        let fileManager = FileManager()
        guard let baseURL = fileManager.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("Untitled") else {

            self.presentCloudDisabledAlert()

            return
        }

        var target = baseURL.appendingPathExtension(DocumentBrowserController.documentExtension)

        /*
            We will append this value to our name until we find a path that
            doesn't exist.
        */
        var nameSuffix = 2

        /*
            Find a suitable filename that doesn't already exist on disk.
            Do not use `fileManager.fileExistsAtPath(target.path!)` because
            the document might not have downloaded yet.
        */
        while (target as NSURL).checkPromisedItemIsReachableAndReturnError(nil) {
            target = URL(fileURLWithPath: baseURL.path + "-\(nameSuffix).\(DocumentBrowserController.documentExtension)")

            nameSuffix += 1
        }

        // Coordinate reading on the source path and writing on the destination path to copy.
        let readIntent = NSFileAccessIntent.readingIntent(with: templateURL, options: [])

        let writeIntent = NSFileAccessIntent.writingIntent(with: target, options: .forReplacing)

        NSFileCoordinator().coordinate(with: [readIntent, writeIntent], queue: self.coordinationQueue) { error in
            if error != nil {
                return
            }

            do {
                try fileManager.copyItem(at: readIntent.url, to: writeIntent.url)

                try (writeIntent.url as NSURL).setResourceValue(true, forKey: URLResourceKey.hasHiddenExtensionKey)

                OperationQueue.main.addOperation {
                    self.openDocumentAtURL(writeIntent.url)
                }
            }
            catch {
                fatalError("Unexpected error during trivial file operations: \(error)")
            }
        }
    }
}
...