unblockUserInteraction

unblockUserInteraction

我有一个简单明了的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:(在为文档数据制作快照副本之后)。但是苹果公​​司的例子表明,他们在调用-unblockUserInteraction之后要做更多的工作。

但是,考虑到此后我没有采取其他措施,我想知道是否在那里调用-unblockUserInteraction毫无意义。

所以我的问题是:


考虑到之后我没有采取其他措施,我对-unblockUserInteraction的呼叫是否有好处?
无论如何,Apple框架会在-unblockUserInteraction返回后立即调用-dataOfType:error:吗?我应该把它留给他们吗?

最佳答案

我只是注意到NSDocument documentation和NSDocument.h中的注释之间的细微差别:

文件:


  如果saveToURL:ofType:forSaveOperation:completionHandler:正在写
  非主线程,因为
  canAsynchronouslyWriteToURL:ofType:forSaveOperation:返回了YES,
  但它仍在阻塞主线程,此方法将解除阻塞
  主线程。否则,它什么都不做。


标头:


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


我认为标题是最新的。

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

fileWrapperOfType:中,我们...


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

10-04 17:02