2012-06-25 14 views
5

estoy trabajando con documentos en la nube ... * Agregar un documento a la nube * Eliminar el documento de la nube * De alguna manera ese documento reaparece a los pocos segundos.eliminados UIDocument reaparece a menudo a partir de nubes

He aquí los detalles:

puedo crear una instancia de UIDocument como esto

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]; 
    }]; 

A continuación, elimine más tarde como esto:

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]; 
    }]; 
}); 

Ahora a pesar de hacer lo anterior, parece que el archivo se elimina durante un (breve) tiempo, pero en varias ocasiones el documento eliminado vuelve a aparecer en la nube uno o unos segundos más tarde. (Puedo verificar esto a través de la configuración de iCloud en otro dispositivo, o mediante una consulta que envía notificaciones sobre actualizaciones). Solo en ALGUNAS ocasiones, el archivo permanece eliminado. ¿Que esta pasando?

Debo señalar que incluso eliminar el archivo de Configuración-> iCloud causará el patrón anterior. El archivo reaparece mágicamente unos segundos más tarde. ¿Problemas de tiempo? ¿Problemas de sincronización?

+0

¿Has descubierto cómo resolver esto? – Bongeh

+1

Creo que mi problema fue que siempre mantuve todos los documentos en mi lista (tengo una interfaz con todos los documentos en la nube ...) abiertos. Ahh, en pocas palabras, se supone que no debes mantener los archivos abiertos a menos que los abras en una especie de interfaz de editor o similar. Mientras un documento esté abierto, creo que no tendría sentido eliminarlo. Cambié mi aplicación para abrir solo documentos cuando el usuario toca en ellos. Creo que esto solucionó mi problema. – Jonny

+0

bien, gracias, eso podría ayudarme a averiguar por qué mis documentos no están desasignando. tal vez necesito cerrarlos :) – Bongeh

Respuesta

9

No elimine documentos mientras están abiertos. :-P

+0

Maldita sea, perdí un acumulado de 20 frustrantes horas en esto. Gracias por aclarar eso! – codrut

2

Una posible fuente de problemas en esta área es que el documentState de su UIDocument pasa a través de estos estados de forma secuencial en eliminar ...

8 (UIDocumentStateEditingDisabled)

luego 0 (UIdocumentStateNormal) probablemente para actualizar el nombre del archivo,

luego 4 (UIDocumentStateSavingError) para borrar.

Por lo tanto, la eliminación puede estar luchando contra su código que se dispara cuando recibe una UIDocumentStateChangedNotification diciendo que el estado es normal.

Espero que esto ayude a alguien.

ACTUALIZACIÓN

En lugar de tratar de conducir a todo, desde DocumentState, como he intentado sin éxito durante un mes para hacer (siguiendo ejemplos Wenderlich) ...

La clave para mí fue la adición de accommodatePresentedItemDeletionWithCompletionHandler a la UIDocument subclassed, que contiene un closeWithCompletionhandler: llamada que cierra el archivo abierto en todos los dispositivos a medida que se detecta la eliminación. A continuación, publica una notificación a mi administrador para eliminar instancias de este elemento de la matriz de datos de origen.

Esto parece mucho más robusto y predecible. Todavía veo varios DocumentState 8 y State 9s llegando a cada dispositivo después de una eliminación, donde esperaría ver solo uno, pero ese puede ser un problema diferente.

Cuestiones relacionadas