2009-08-26 5 views

Respuesta

13

La manera fácil es utilizar los métodos de conveniencia de NSData initWithContentOfURL: y writeToFile:atomically: para obtener los datos y escribirlos, respectivamente. Tenga en cuenta que esto es síncrono y bloqueará el hilo en el que lo ejecute hasta que se completen la recuperación y la escritura.

Por ejemplo:

// Create and escape the URL for the fetch 
NSString *URLString = @"http://example.com/example.png"; 
NSURL *URL = [NSURL URLWithString: 
       [URLString stringByAddingPercentEscapesUsingEncoding: 
          NSASCIIStringEncoding]]; 

// Do the fetch - blocks! 
NSData *imageData = [NSData dataWithContentsOfURL:URL]; 
if(imageData == nil) { 
    // Error - handle appropriately 
} 

// Do the write 
NSString *filePath = [[self documentsDirectory] 
         stringByAppendingPathComponent:@"image.png"]; 
[imageData writeToFile:filePath atomically:YES];

Cuando el método documentsDirectory es robado descaradamente de this question:

- (NSString *)documentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    return [paths objectAtIndex:0]; 
}

Sin embargo, a menos que la intención de hilo a ti mismo Esto detendrá la actividad de la interfaz de usuario, mientras que las descargas de archivos. En su lugar, puede consultar NSURLConnection y su delegado: se descarga en segundo plano y notifica a un delegado sobre los datos descargados de forma asincrónica, de modo que puede crear una instancia de NSMutableData y luego escribirla cuando la conexión finalice. Su delegado puede contener métodos como:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the data to some preexisting @property NSMutableData *dataAccumulator; 
    [self.dataAccumulator appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Do the write 
    NSString *filePath = [[self documentsDirectory] 
          stringByAppendingPathComponent:@"image.png"]; 
    [imageData writeToFile:filePath atomically:YES]; 
}

Los pequeños detalles, como la que se declara la dataAccumulator y tratamiento de errores, se dejan al lector :)

Los documentos importantes:

+0

Gracias ! Ummm ... ¿Sincrónico? ¿Esto significa que es mejor usar una "rueda/barra de progreso" mientras se realiza el trabajo? – RexOnRoids

+2

Sincrónico significa que toda la actividad en su programa (bueno, el hilo principal) se detendrá por completo hasta que finalice la descarga. Esto significa que la interfaz de usuario aparecerá congelada para el usuario, y los rotantes ni siquiera comenzarán a animar hasta que se complete la descarga (dejándolos bastante inútiles). El segundo método, una descarga asíncrona, permite que su programa siga trabajando en primer plano mientras se descarga en segundo plano. De cualquier manera, sí, deberías usar algún tipo de indicador de progreso. – Tim

Cuestiones relacionadas