У меня есть приложение на основе UIDocument
, которое использует NSFileWrapper
s для хранения данных. Файловая оболочка «мастер» содержит много дополнительных обложек файлов каталога, каждая из которых представляет собой другую страницу документа.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 может выполнить эту работу? –
@MikeM Возможно, вы правы в том, что это предотвратит крах, но я беспокоюсь, что у него есть потенциал, чтобы действительно замедлить работу. Часто обновления в приложении небольшие и частые, и для приложения требуется обновленный контент. Мне придется еще раз изучить этот подход и посмотреть, насколько он жизнеспособен. Однако до сих пор остается вопрос - является ли санкционированный подход к использованию UIDocument безопасным для потоков? – Stuart