我一直在这里阅读有关 UIDocument 和 UIManagedDocument 的所有内容,因为 UIManagedDocument 有更多帮助,它是 UIDocument 的子类,但我无法弄清楚我需要做什么。
当用户点击我的应用程序的添加按钮来创建新文档时,我需要创建文档并在其中预填充几个项目。只要我单步执行调试器,我的代码就可以正常工作,但是在全速情况下,这两个项目不会进入文档。
我在我的 AppDelegate 中存储了对文档的引用,并定义了一个宏以简化代码中的阅读:
#define SelectedDocument [(AppDelegate *)[[UIApplication sharedApplication] delegate] selectedDocument]
所以在处理添加请求时,我的代码是这样的:
GnKDocument *tmp = [[GnKDocument alloc] initWithFileURL:fileURL];
[(AppDelegate *)[[UIApplication sharedApplication] delegate] setSelectedDocument:tmp];
[SelectedDocument saveToURL:fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
[SelectedDocument openWithCompletionHandler:^(BOOL success) {
if (success) {
[SelectedDocument setDateCreated:[NSDate date]];
NSString *c1UUID = [SelectedDocument appendChapterWithName:@"Chapter 1"
withColor:kChapterColorYellow];
NSString *p1c1UUID = [SelectedDocument appendPageWithParent:c1UUID
withName:@"Page 1"
withColor:kPageColorRed];
NSLog(@"Just added Page 1 as %@ to chapter %@", p1c1UUID, c1UUID);
[SelectedDocument closeWithCompletionHandler:^(BOOL success) {
}];
}
}
}];
我的 UIDocument 子类中的两个附加调用完成它们的工作,然后调用
[self updateChangeCount:UIDocumentChangeDone];
作为一个测试步骤,我重写了该方法,只是为了注销正在进行的更改:
- (void)updateChangeCount:(UIDocumentChangeKind)change
{
[super updateChangeCount:change];
NSLog(@"GnKDocument recording a change");
}
我做事的顺序正确吗?我应该将呼叫分派到各个队列吗?
- 初始化实例
- 保存以进行创建
- 打开它(将我的初始项目添加到它)
- 做我的补充
- 关闭它(根据文档, closeWithCompletionHandler: 异步保存任何更改)。
同样,如果我在每次调用(saveToURL:、openWithCompletionHandler: 和 closeWithCompletionHandler)处设置断点并“跳过”这些调用,然后运行以进入完成处理程序,则文档最终会按我的意图保存在磁盘上。如果我禁用断点并再次运行,则会在磁盘上创建文档并记录更改,但关闭的文件不包含我的两个初始元素。