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)
}
}