0

我一直在这里阅读有关 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");
}

我做事的顺序正确吗?我应该将呼叫分派到各个队列吗?

  1. 初始化实例
  2. 保存以进行创建
  3. 打开它(将我的初始项目添加到它)
  4. 做我的补充
  5. 关闭它(根据文档, closeWithCompletionHandler: 异步保存任何更改)。

同样,如果我在每次调用(saveToURL:、openWithCompletionHandler: 和 closeWithCompletionHandler)处设置断点并“跳过”这些调用,然后运行以进入完成处理程序,则文档最终会按我的意图保存在磁盘上。如果我禁用断点并再次运行,则会在磁盘上创建文档并记录更改,但关闭的文件不包含我的两个初始元素。

4

1 回答 1

0

在很长一段时间里,我认为差异在于代码执行的速度是创建还是避免了竞争条件。但是在调查这种可能性时,我在任何关键事件发生的地方都添加了许多 NSLog 语句......问题就消失了。所以这显然不是时间问题。回顾 NSLog 语句的内容,我意识到一些值被延迟加载,在 NSLog 语句中引用它们的行为导致它们被加载。同样,在单步执行代码时,我怀疑“打印...的描述”命令具有相同的效果(也许)。

因此,在我的例子中,UIDocument 子类构建了一个包含两个文件的文件包装器,一个用于有关文档的元数据,另一个用于实际文档数据。有一个测试来验证文档中的最小正确性,并且该测试使用了元数据文件中的值,这些值本来是要延迟加载但从未被访问过,因此该测试确定该文件无效并设置了所有初始值再一次,清除了我在文件中预填充的两个项目。

于 2012-09-19T03:58:49.887 回答