我有一个直接的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
是否有任何意义。
所以我的问题:
考虑到我之后没有采取其他行动,我打电话给-unblockUserInteraction
做了什么好事?
Apple Frameworks是否在-unblockUserInteraction
返回后立即致电-dataOfType:error:
?我应该留给他们吗?
答案 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:
我们......
unblockUserInteraction
...