Ho un'app basata su UIDocument
che utilizza NSFileWrapper
s per archiviare i dati. Il wrapper di file "master" contiene molti wrapper di file di directory aggiuntivi, ognuno dei quali rappresenta una pagina diversa del documento.UIDocument & NSFileWrapper - NSFastEnumerationMutationHandler durante la modifica del file wrapper durante un salvataggio
Ogni volta che apporto una modifica al documento mentre è in corso il salvataggio dello UIDocument
(in writeContents:andAttributes:safelyToURL:forSaveOperation:error:
), l'app si arresta in modo anomalo. Ecco l'analisi dello stack:
Sembra chiaro che sto modificando la stessa istanza di involucro di file che il UIDocument
enumera sopra in background. Effettivamente, ho verificato che quando si restituisce un'istantanea del modello di dati in contentsForType:error:
, i wrapper del file secondario restituiti puntano agli stessi oggetti di quelli attualmente residenti (e in fase di modifica) nel modello di dati e non alle copie.
- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
if (!_fileWrapper) {
[self setupEmptyDocument];
}
return [[NSFileWrapper alloc] initDirectoryWithFileWrappers:[_fileWrapper fileWrappers]];
}
Questo è l'approccio sanzionato per l'attuazione di questo metodo (secondo WWDC 2012 Session 218 - Using iCloud with UIDocument).
Quindi suppongo che la domanda sia: In che modo questo approccio può essere sicuro?
La situazione è in qualche modo diversa quando i wrapper del file master fileWrappers
sono essi stessi wrapper di file di directory? Se l'approccio sanzionato è sbagliato, come dovrebbe essere ?
Non ho incontrato questa situazione, ma sembra che un NSFileCoordinator potrebbe fare il lavoro? –
@MikeM Forse hai ragione nel prevenire l'incidente, ma temo che abbia il potenziale per rallentare davvero le cose. Spesso gli aggiornamenti dell'app sono piccoli e frequenti e per l'applicazione è necessario un contenuto aggiornato. Dovrò approfondire questo approccio e vedere se è fattibile. Tuttavia, la domanda rimane ancora: l'approccio sanzionato all'utilizzo di UIDocument non è sicuro? – Stuart