Я заметил, что в примере 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)")
}
}
}
}