2012-06-25 12 views
5

Sto lavorando con documenti nel cloud ... * Aggiungi un documento al cloud * Elimina quel documento dal cloud * In qualche modo quel documento riappare alcuni secondi dopo.UIDocument cancellato spesso dal cloud

Ecco i dettagli:

creo un'istanza di UIDocument come questo

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:@"somenewfilename"]; 

    MyDoc* docTemp = [[MyDoc alloc] initWithFileURL:ubiquitousPackage]; 
    docTemp.mapContent = [NSString stringWithString:self.currentdocument.mapContent]; 

    [docTemp saveToURL:[docTemp fileURL] 
     forSaveOperation:UIDocumentSaveForCreating 
    completionHandler:^(BOOL success) {    
     if (success) { 
      DLog(@"New document %@ saved/added: %@", newFilename, docTemp); 
     } 
     else { 
      DLog(@"Failed saving new document: %@", newFilename); 
     } 
     [docTemp release]; 
    }]; 

Quindi eliminare in un secondo momento come questo:

NSURL* fileURL = self.currentdocument.fileURL; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)  { 
    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
    NSError* error = nil; 
    [fileCoordinator coordinateWritingItemAtURL:fileURL options:NSFileCoordinatorWritingForDeleting error:&error byAccessor:^(NSURL* writingURL) { 
     if (error != nil) { 
      DLog(@"Error with %@! %@", fileURL, error); 
      return; 
     } 
     DLog(@"Got writingURL: %@", writingURL); 
     NSFileManager* fileManager = [[NSFileManager alloc] init]; 
     if ([fileManager removeItemAtURL:writingURL error:nil]) { 
      DLog(@"Deleted %@!", writingURL); 
     } 
     else { 
      DLog(@"ERROR Failed deleting %@!", self.currentdocument); 
     } 
     [fileManager release]; 
     [fileCoordinator release]; 
    }]; 
}); 

Ora, nonostante fare quanto sopra, sembra che il file viene eliminato per un (breve) mentre, ma in diverse occasioni il documento eliminato riappare nel cloud uno o pochi secondi dopo. (Posso verificarlo tramite le impostazioni di iCloud su un altro dispositivo o tramite una query che invia notifiche sugli aggiornamenti). Solo in alcune occasioni il file rimane cancellato. Cosa sta succedendo?

Devo notare che anche l'eliminazione del file da Impostazioni-> iCloud causerà il modello sopra. Il file riappare magicamente pochi secondi dopo. Problemi di temporizzazione? Sincronizzare i problemi?

+0

Hai scoperto come risolvere questo? – Bongeh

+1

Penso che il mio problema fosse che tenevo sempre tutti i documenti nella mia lista (ho un'interfaccia con tutti i documenti nel cloud ...) aperti. Ah, per farla breve non devi mantenere i file aperti a meno che non li apri in una sorta di interfaccia di editor o simile. Finché un documento è aperto, suppongo che non avrebbe senso cancellarlo. Ho cambiato la mia app per aprire solo i documenti quando l'utente li tocca. Penso che questo abbia risolto il mio problema. – Jonny

+0

okay, grazie, questo potrebbe aiutarmi a capire perché i miei documenti non sono stati trasferiti! forse ho bisogno di chiuderli :) – Bongeh

risposta

9

Non eliminare i documenti mentre sono aperti. :-P

+0

Dio dannazione, ho perso un cumulato di 20 ore frustranti su questo. Grazie per averlo chiarito! – codrut

2

Una possibile fonte di problemi in questo settore è che il documentState del vostro UIDocument passa attraverso questi stati in sequenza sullo eliminare ...

8 (UIDocumentStateEditingDisabled)

quindi 0 (UIdocumentStateNormal) probabilmente per aggiornare il nome del file,

quindi 4 (UIDocumentStateSavingError) per cancellare.

Pertanto la cancellazione potrebbe essere la lotta contro il codice che si attiva quando si riceve un UIDocumentStateChangedNotification che dice che lo stato è normale.

Spero che questo aiuti qualcuno.

UPDATE

Invece di cercare di guidare tutto da DocumentState, come ho cercato, senza successo, per un mese per fare (esempi seguenti Wenderlich) ...

La chiave per me è stata aggiunta accommodatePresentedItemDeletionWithCompletionHandler al sottoclasse UIDocument, contenente un closeWithCompletionhandler: chiamata che chiude il file aperto su tutti i dispositivi quando viene rilevata la cancellazione. Quindi invia una notifica al mio manager per rimuovere le istanze di questo elemento dall'array dei dati di origine.

Questo sembra molto più robusto e prevedibile. Vedo ancora diversi documenti DocumentState 8 e State 9 che arrivano a ciascun dispositivo dopo una cancellazione, dove mi aspetterei di vederne solo uno, ma potrebbe trattarsi di un problema diverso.

Problemi correlati