启用NSDocument Asynchronous Saving时,在一个简单的-dataOfType中调用-unblockUserInteraction是否有任何意义:错误:?

时间:2011-10-29 00:03:14

标签: macos cocoa osx-lion

我有一个直接的Mac OS X,Cocoa,基于文档的应用程序,它使用新的10.7自动保存,版本和异步保存API。我完全使用NSDocument API免费获取Apple的所有基于文档的应用程序功能。

为了支持新的Lion Autosave / Versions / AsyncSaving,我在NSDocument子类中重写了以下方法,如下所示:

@implementation MyDocument 
...
+ (BOOL)autosavesInPlace { return YES; }

- (BOOL)canAsynchronouslyWriteToURL:(NSURL *)URL ofType:(NSString *)type forSaveOperation:(NSSaveOperationType)op {
    return YES;
}

我还覆盖了-dataOfType:error:以帮助实现将文档的数据保存到磁盘:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outErr {
    NSData *data = nil;

    if ([typeName isEqualToString:MY_SUPPORTED_TYPE_NAME]) {
        data = makeSnapshotCopyOfMyDocumentData(); // assume return value is autoreleased
    } else if (outErr) {
        *outErr = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:nil];
    }

    // not sure this is doing much good, since i take no action after this.
    [self unblockUserInteraction];

    return data;
}
...
@end

看看我到底在那里打电话给-unblockUserInteraction了吗?

在支持新的10.7 AsyncSaving功能时,Apple建议您在-unblockUserInteraction实施中尽早调用-dataOfType:error:(在制作文档数据的快照副本之后)。但是,Apple的例子显示他们在致电-unblockUserInteraction之后做了更多的工作。

然而,考虑到此后我没有采取任何其他行动,我想知道在那里调用-unblockUserInteraction是否有任何意义。

所以我的问题:

  1. 考虑到我之后没有采取其他行动,我打电话给-unblockUserInteraction做了什么好事?

  2. Apple Frameworks是否在-unblockUserInteraction返回后立即致电-dataOfType:error:?我应该留给他们吗?

1 个答案:

答案 0 :(得分:4)

我刚刚注意到NSDocument documentation与NSDocument.h中的注释之间存在细微的措辞差异:

文档:

  

如果saveToURL:ofType:forSaveOperation:completionHandler:正在写入   一个非主线程,因为   canAsynchronouslyWriteToURL:ofType:forSaveOperation:返回YES,   但它仍然阻塞主线程,这种方法解锁了   主线程。 否则,它什么都不做。

部首:

  

如果-saveToURL:ofType:forSaveOperation:completionHandler:正在写   一个非主线程,因为   -canAschronyWriteToURL:ofType:forSaveOperation:返回YES,但仍然阻塞主线程,取消阻塞主线程。   否则,什么都不做。

我认为标题更新。

我正在开发一个在必须在主线程上运行的最后一行之后调用unblockUserInteraction的应用程序。 (至少那是我理解的方式)
我认为我们的代码符合Apple在设计NSDocument的异步保存部分时所考虑的情况:

fileWrapperOfType:我们......

  • 为我们的文件包装器创建一个QL预览(必须在 主线)...
  • unblockUserInteraction ...
  • ...“长”运行文件保存任务(涉及压缩)