此仓库包含 ULDocument
,这是一个抽象文档类,设计成 NSDocument 和 UIDocument 的轻量级替代品。它用于我们的应用程序 Ulysses 和 Daedalus 中。您可以根据MIT 许可证的条款在自己的应用程序中使用它。
ULDocument
的优点包括
它是一个纯模型类,不依赖于视图或控制器层。
它专为需要同时展示数十个文档实例的鞋盒应用程序而设计。
它已准备好支持 iCloud。
它在 OS X 和 iOS 上工作。
该仓库作为 CocoaPod:ULDocument
提供。
或者,您可以克隆该存储库并在其中编译 ULDocument 作为库。您可以将此库链接到您的 OS X 或 iOS 项目中。您将在 Header
文件夹中找到所有必需的头文件。它还包含一个小的单元测试套件。
ULDocument
是一个抽象类。要将其用于您自己的应用程序,您需要创建它的一个子类。头文件 ULDocument_Subclassing.h
包含所有对子类化有用的钩子或辅助方法。通常,实施以下抽象方法以读写您的文档就足够了
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper error:(NSError **)outError;
- (NSFileWrapper *)fileWrapperWithError:(NSError **)outError;
您实现 -readFromFileWrapper:
时,应将读取的内容存储到子类的一个属性中。例如,文本文档应有一个 text
属性,将在读取文档时设置。此属性通常是绑定到您的文档编辑视图的可变对象。您的文档子类必须观察此属性上的变化,并在变化被观察到时调用 -updateChangeDate
。为了支持自动保存和撤销,任何文档编辑器都必须使用由您的文档实例提供的 undoManager
。
ULDocument 中已实现了所有 iCloud 需要的魔法:它会在外部发生更改时自动更新文档的内容,并正确地同步您的文件访问。因此,只需将您的文档存储在应用程序的 ubiquity container 中就足够了。
您可以使用 -initWithFileURL:readOnly:
创建您文档子类的新实例。通常,您可以设置 readOnly
为 NO
。但是,出于性能考虑,您应该考虑在足以满足需求时以只读模式打开文档。
在初始化文档实例之后,您可以使用 -openWithCompletionHandler:
异步打开并读取其内容。只需使用 -saveWithCompletionHandler:
保存任何更改。您还可以使用 -saveToURL:forSaveOperation:completionHandler:
将文档明确存储到新的URL上。
如果不再需要文档,您应使用 -closeWithCompletionHandler:
关闭它。任何未保存的更改将自动保存。
由于 ULDocument 涵盖了 OS X 和 iOS 的 NSFileCoordinator API,它可以在任意后台线程上操作任何属性。当您从视图观察 ULDocument 的属性时,您可能需要在主队列上调度观察处理程序。
通常,您应该异步处理所有观察以防止死锁:ULDocument 使用锁来大量同步文件和属性访问。