我有一个基于UIDocument
的应用程序,它使用NSFileWrapper
来存储数据。 '主'文件包装器包含许多附加的目录文件包装器,每个包装器代表文档的不同页面。UIDocument&NSFileWrapper - NSFastEnumerationMutationHandler在保存期间更改文件包装
每当我在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可能做的工作吗? – 2013-03-05 19:31:36
@MikeM你可能是对的,因为它可以防止崩溃,但我担心它有可能真的放慢速度。应用程序中的更新通常很少且频繁,因此应用程序需要最新的内容才能保持响应。我将不得不进一步调查这种方法,看看它是否可行。然而,问题仍然存在 - UIDocument使用不是线程安全的认可方法? – Stuart 2013-03-05 20:14:38