2012-03-12 11 views
13

Estoy utilizando NSFileManager's startDownloadingUbiquitousItemAtURL para descargar el archivo de iCloud a copia local (el local aún no tiene la copia del archivo en este caso). Parece que no puedo encontrar la devolución de llamada para este proceso. Necesito la devolución de llamada para decirle a mi aplicación que el archivo solicitado se terminó de descargar (a la copia local) para que otra tarea pueda comenzar a leer el contenido del archivo y haga cosas.iCloud: Devolución de llamada para NSFileManager's startDownloadingUbiquitousItemAtURL?

Puedo verificar si el archivo se descarga. Pero involucraría en las encuestas constantemente. ¿Hay alguna forma de hacerlo sin configurar un temporizador para sondear esto?

Respuesta

28

Creo que este método está destinado a ser utilizado junto con los coordinadores de archivos basados ​​en Apple's documentation. Por lo que sería necesario utilizar un coordinador de archivo de este modo:

NSURL *itemURL = nil; // this is the URL you want to read from 

__block NSData *data = nil; 
NSError *error = nil; 
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
[coordinator coordinateReadingItemAtURL:itemURL options:0 error:&error byAccessor:^(NSURL *newURL) { 
    data = [NSData dataWithContentsOfURL:newURL]; 
}]; 

Este será sincrónica, sin embargo, lo que si quería hacer algo de forma asíncrona, se puede utilizar como bloques de modo:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // read info from the URL using the code above 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // handle data read from the URL 
    }); 
}); 
+1

el método de NSFileCoordinator funciona muy bien en el modo sincrónico. También necesitaba la versión asíncrona en la última etapa de mi proyecto, ¡voté por eso! Gracias. – user523234

+0

@SpaceDog Estás 100% en lo cierto. He estado lidiando con estas API y, francamente, estoy chiflado. – mattsven

+3

Las API creadas por Apple se pueden dividir en dos categorías: 1) las que chupan, se confunden como infierno, vagas, incompletas y mal documentadas y 2) las que son pasables. No hay una sola API que esté bien diseñada. No me malinterpretes Me encantan los productos que Apple hace, pero la Apple que se ocupa de los desarrolladores y las API no es la Apple con altos estándares que las personas conozcan. De lo contrario. – SpaceDog

-1

Para cargar correctamente a iCloud vas a necesitar también algo como esto (otra cosa no funcionó: |)

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 

    NSString *FileNS = @"myfile.dat"; 
    NSURL *FileURL = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:FileNS ]; 


    BYTE *data = NULL;//Put your file data in here 
    int FileSize = 0;//replace with your file size 
    NSData *myData = [[NSData alloc] initWithBytes:data length:FileSize]; 
    [myData writeToFile:[FileURL path] atomically:YES]; 
+0

op pedido para descargar, no cargar – SpaceDog

Cuestiones relacionadas