我有一個基於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