【发布时间】:2013-02-20 08:31:12
【问题描述】:
我有一个基于UIDocument 的应用程序,它使用NSFileWrappers 来存储数据。 “主”文件包装器包含许多额外的目录文件包装器,每个包装器代表文档的不同页面。
每当我在UIDocument 保存时(在writeContents:andAttributes:safelyToURL:forSaveOperation:error: 中)对文档进行更改,应用程序就会崩溃。这是堆栈跟踪:
很明显,我正在修改UIDocument 在后台枚举的文件包装器的同一实例。事实上,我检查了当返回 contentsForType:error: 中的数据模型的快照时,返回的子文件包装器指向的对象与数据模型中当前驻留(和正在编辑)的对象相同,而不是副本。
- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
if (!_fileWrapper) {
[self setupEmptyDocument];
}
return [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[_fileWrapper fileWrappers]];
}
这是实施此方法的认可方法(根据WWDC 2012 Session 218 - Using iCloud with UIDocument)。
所以我想问题是:这种方法如何是线程安全的?
当主文件包装器的fileWrappers 本身是目录文件包装器时,情况是否有所不同?如果批准的方法是错误的,应该怎么做?
【问题讨论】:
-
我还没有遇到过这种情况,但似乎 NSFileCoordinator 可以完成这项工作?
-
@MikeM 你可能是对的,因为它可以防止崩溃,但我担心它有可能真正减慢速度。应用程序中的更新通常很小且频繁,应用程序需要最新的内容才能保持响应。我将不得不进一步研究这种方法,看看它是否可行。但是问题仍然存在 - UIDocument 使用的认可方法不是线程安全的吗?
标签: ios thread-safety save uidocument nsfilewrapper