我正在尝试DocumentGroup
在我的应用程序中设置一个,但还没有ReferenceFileDocument
适用于的示例。我知道 aFileDocument
是什么,但ReferenceFileDocument
s 有什么不同。
在文档中它说的是:
ReferenceFileDocument 的一致性预计是线程安全的,反序列化和序列化将在后台线程上完成。
我正在尝试DocumentGroup
在我的应用程序中设置一个,但还没有ReferenceFileDocument
适用于的示例。我知道 aFileDocument
是什么,但ReferenceFileDocument
s 有什么不同。
在文档中它说的是:
ReferenceFileDocument 的一致性预计是线程安全的,反序列化和序列化将在后台线程上完成。
名称中有一个提示: ReferenceFileDocument
是一个引用类型(即类)的文档。FileDocument 用于基于结构的文档。
这会影响文档的保存方式,因为 SwiftUI 可以只复制引用类型并保存它,而无需担心您在保存过程中进行修改,因为它是一个值类型或值类型树。
使用ReferenceFileDocument
,SwiftUI 似乎也没有明确的方法来知道何时保存,所以这取决于你告诉它。没有直接的“文档很脏,立即保存”的方法,因此您通知 SwiftUI 您已完成需要保存的操作的方式是通过撤消管理器。
您还需要提供一种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)
}
}