UIKit框架为应用提供了管理多个文档的能力,通过将每个文档包含的一套数据存储在本地沙盒或者iCloud上。
支持这一能力的是源于一个叫UIDocument的类,在iOS5.0时引入的。一个机遇文档的应用必须创建一个UIDocument的子类,通过它的数据结构加载文档数据,并且支持让UIDocument将数据写进文档文件中。UIDocument会为你处理很多文档管理相关的细节。除了集成iCloud外,UIDocument还能在后台读写文档数据,这样用户在你的应用上进行交互的时候就不会变得反应迟钝。它同时也能自动和定时保存数据,这样用户就无需很明确地进行保存的操作。
文档对象是模型控制器
在MVC模式中,文档对象——UIDocument的子类——是模型控制器。一个文档对象管理一个文档相关的数据,特别是一些用户能看到和编辑的对象。一个文档对象,典型的用法是,被一个为用户展示文档的VC所管理。
参考链接:Designing a Document-Based Application
当你设计一个应用时,考虑文档数据和其他问题
在你开始编写代码时,你应用考虑下如何设计基于文档的应用。最重要的是,对你的应用来说,什么是最好的文档数据格式?如何让这个数据格式在iOS和Mac OS上运作?什么是最合适的文档类型?
你同时应该计划下应用的VC和View如何管理打开文档、提示错误、移动到或从iCloud的存储移动所选文件的细节。
参考链接:Designing a Document-Based Application, Document-Based Application Preflight
创建UIDocument子类要求实现两个方法
一个文档对象最重要的角色是沟通一个文档文件和内部表示文档数据的模型对象之间。它为UIDocument类提供写进文档文件的数据,和当文档文件被读取时,使用UIDocument提供的数据来初始化这些模型对象。为了实现这些功能,你的UIDocument子类必须重写 contentsForType:error: 方法和 loadFromContents:ofType:error: 方法。
参考链接:Creating a Custom Document Object
管理文档的生命周期
一个应用应该管理文档的以下生命周期:
- 创建文档
- 打开和关闭文档
- 监视文档的状态变化和处理错误和版本冲突
- 移动文档到iCloud存储(或者从iCloud存储上移除)
- 删除文档
参考链接:Managing the Life Cycle of a Document
基于用户的要求将文档存放在iCloud上
应用为用户提供选择:将全部文档存储在iCloud上,或者村部文档存放在本地沙盒中。为了将文档移动到iCloud上,需要创建一个指明文档在iCloud容器目录中的文件URL,同时调用NSFileManager类的具体方法,将文件的URL传给它。从iCloud上移动文件到本地沙盒遵循类似的方法。
参考链接:Managing the Life Cycle of a Document
确保文档数据能自动保存
UIDocument每隔一段时间会自用保存文档数据。用户不需要明确地进行保存文档的操作。然而,你的应用需要通过实现撤销和重做或者跟踪文档的变更来实现自动保存功能。
参考链接:Change Tracking and Undo Operations
解决不同文档版本间的冲突
当你的文档存储在iCloud上时,文档的不同版本可能会出现冲突。当冲突出现时,UIKit会通知应用,这时应用自己必须尝试解决这些冲突,或者让用户在不同版本中选中想保留的版本。
参考链接:Resolving Document Version Conflicts
其他建议
在你开始编写基于文档的应用时,你应该至少阅读以下两篇文章:
Designing a Document-Based Application
Document-Based Application Preflight
这些文章关于如何设计和配置相关问题,能够为你设计一个良好的文档应用提供整体的认识。