我有一个简单明了的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
...
...“长时间”运行文件保存任务(涉及压缩)