2011-03-16 12 views

Respuesta

144

No estoy seguro de lo que es wget, pero para obtener un archivo desde la web y almacenar de forma local, puede utilizar NSData:

NSString *stringURL = @"http://www.somewhere.com/thefile.png"; 
NSURL *url = [NSURL URLWithString:stringURL]; 
NSData *urlData = [NSData dataWithContentsOfURL:url]; 
if (urlData) 
{ 
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.png"]; 
    [urlData writeToFile:filePath atomically:YES]; 
} 
+3

Sólo me preguntaba, es este bloqueo o no? Supongo que este bloquea. – schystz

+6

@schystz si al bloquear significa síncrono, entonces sí lo es. – carlossless

+0

Del mismo modo, uno también podría estar interesado en '+ [NSString stringWithContentsOfURL: encoding: error:]' – Zmaster

6

Creo que una manera mucho más fácil es utilizar ASIHTTPRequest. Tres líneas de código puede lograr esto:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setDownloadDestinationPath:@"/path/to/my_file.txt"]; 
[request startSynchronous]; 

Link to Reference

ACTUALIZACIÓN: Debo mencionar que ASIHTTPRequest ya no se mantiene. El autor ha aconsejado específicamente a las personas a usar otro marco en su lugar, como AFNetworking

1

Hace algún tiempo implementé una biblioteca de "administrador de descargas" fácil de usar: PTDownloadManager. ¡Podrías intentarlo!

+0

Muy amable de tu parte. Gracias. –

0

Hay muchas maneras:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget, una comercial con características de gran alcance.

+0

¿Todavía se admite ASIHTTP en algún lugar? El sitio web aconseja el uso de otra cosa: http://allseeing-i.com/ASIHTTPRequest/ – Robert

+1

No. No use ASIHTTP. Para una herramienta de alto nivel, use AFNetworking en su lugar: https://github.com/AFNetworking/AFNetworking – GnarlyDog

13

me gustaría utilizar un asíncrono acceso mediante un bloque de terminación.

Este ejemplo guarda el logotipo de Google en el directorio de documentos del dispositivo. (IOS 5+, OSX 10.7+)

NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
NSString *filePath = [documentDir stringByAppendingPathComponent:@"GoogleLogo.png"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com/images/srpr/logo11w.png"]]; 
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    if (error) { 
     NSLog(@"Download Error:%@",error.description); 
    } 
    if (data) { 
     [data writeToFile:filePath atomically:YES]; 
     NSLog(@"File is saved to %@",filePath); 
    } 
}]; 
11

NSURLSession introdujo en iOS 7, es la forma recomendada SDK de descarga de un archivo. No es necesario importar bibliotecas de terceros.

NSURL *url = [NSURL URLWithString:@"http://www.something.com/file"]; 
NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:url]; 
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; 
self.downloadTask = [self.urlSession downloadTaskWithRequest:downloadRequest]; 
[self.downloadTask resume]; 

continuación, puede utilizar los métodos de delegado NSURLSessionDownloadDelegate para controlar errores, la terminación de descarga, descarga el progreso, etc ... Hay métodos bloque de finalización manejador de devolución de llamada en línea también si usted prefiere. Las manzanas explican cuándo debes usar una sobre la otra.

tener una lectura de estos artículos:

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

+1

Funcionará de manera asincrónica –

+0

Sería extraño que una API de red no funcione de forma asíncrona. Así que sí, la API de NSURLSession es muy asíncrona: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa

+0

Manejar la pieza de delegado es molesto. –

Cuestiones relacionadas