SwiftUI中“DocumentGroups”的“FileDocument”和“ReferenceFileDocument”有什么区别?

SwiftUI中“DocumentGroups”的“FileDocument”和“ReferenceFileDocument”有什么区别?,swiftui,documentgroup,Swiftui,Documentgroup,我正试图在我的应用程序中设置一个DocumentGroup,但目前还没有ReferenceFileDocument的示例。我知道什么是FileDocument,但是ReferenceFileDocuments有何不同 总之,它说的是: 与ReferenceFileDocument的一致性应是线程安全的, 反序列化和序列化将在后台完成 线 ReferenceFileDocument是一种将在后台自动保存的文档类型。它通过撤消管理器通知更改,因此为了使用它,您还必须使文档可撤消 我在文件中看到的唯一

我正试图在我的应用程序中设置一个
DocumentGroup
,但目前还没有
ReferenceFileDocument
的示例。我知道什么是
FileDocument
,但是
ReferenceFileDocument
s有何不同

总之,它说的是:

与ReferenceFileDocument的一致性应是线程安全的, 反序列化和序列化将在后台完成 线


ReferenceFileDocument
是一种将在后台自动保存的文档类型。它通过
撤消管理器
通知更改,因此为了使用它,您还必须使文档可撤消

我在文件中看到的唯一一点是


是一个工作示例。

名称中有一个提示:
ReferenceFileDocument
是一个引用类型(即类)的文档。FileDocument用于基于结构的文档

这会影响文档的保存方式,因为SwiftUI只需复制引用类型并保存它,而不必担心在保存过程中出现并修改它,因为它是一种值类型或值类型树

对于
ReferenceFileDocument
,SwiftUI似乎也没有明确的方法知道何时保存,所以这取决于您告诉它。没有直接的“doc is dirty,save it now”(文档已脏,立即保存)方法,因此通知SwiftUI您已经完成了需要保存的操作的方式是通过undo manager

您还需要提供一个
snapshot
方法来返回文档的副本,该副本可以安全保存

final class QuizDocument: ReferenceFileDocument, ObservableObject {
    
    @Published var quiz: QuizTemplate

    init(quiz: QuizTemplate) {
        self.quiz = quiz
    }

    static var readableContentTypes: [UTType] { [.exampleText] }

    init(configuration: ReadConfiguration) throws {
        guard let data = configuration.file.regularFileContents,
              let quiz = try? JSONDecoder().decode(QuizTemplate.self, from: data)
        else {
            throw CocoaError(.fileReadCorruptFile)
        }

        self.quiz = quiz
    }

    // Produce a snapshot suitable for saving. Copy any nested references so they don't
    // change while the save is in progress.
    func snapshot(contentType: UTType) throws -> QuizTemplate {
        return self.quiz
    }

    // Save the snapshot
    func fileWrapper(snapshot: QuizTemplate, configuration: WriteConfiguration) throws -> FileWrapper {
        let data = try JSONEncoder().encode(quiz)
        return .init(regularFileWithContents: data)
    }
}