2011-03-16 13 views

risposta

144

Non sono sicuro di quello che è wget, ma per ottenere un file dal Web e memorizzare localmente, è possibile utilizzare 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

Chiedo solo, questo blocco o no? Suppongo che questo blocchi uno. – schystz

+6

@schystz se bloccando intendi sincrono, allora sì lo è. – carlossless

+0

Analogamente, uno potrebbe anche essere interessato a '+ [NSString stringWithContentsOfURL: encoding: error:]' – Zmaster

6

Penso che un modo molto più semplice è quello di utilizzare ASIHTTPRequest. Tre righe di codice in grado di ottenere questo risultato:

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

Link to Reference

UPDATE: Devo dire che ASIHTTPRequest non è più mantenuto. L'autore ha consigliato, in particolare, alle persone di utilizzare altri framework, come AFNetworking

1

A volte ho implementato una libreria "download manager" di facile utilizzo: PTDownloadManager. Potresti dargli un colpo!

+0

Molto gentile da parte tua. Grazie. –

0

Ci sono tanti modi:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget, una commerciale con le caratteristiche potenti.

+0

ASIHTTP è ancora supportato da qualche parte? Il sito Web consiglia l'uso di qualcos'altro: http://allseeing-i.com/ASIHTTPRequest/ – Robert

+1

No. Non utilizzare ASIHTTP. Per uno strumento di alto livello utilizzare invece AFNetworking: https://github.com/AFNetworking/AFNetworking – GnarlyDog

13

si usa un asincrono accesso utilizzando un blocco di completamento.

Questo esempio salva il logo di Google nella directory dei documenti 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 introdotto in iOS 7, è il modo SDK consigliato di download di un file. Non è necessario importare librerie di terze parti.

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

È quindi possibile utilizzare i metodi delegato NSURLSessionDownloadDelegate per monitorare gli errori, il completamento scaricare, scaricare il progresso ecc ... Ci sono in linea metodi completamento blocco del gestore di richiamata anche se si preferisce. I documenti delle mele spiegano quando è necessario utilizzarne uno sull'altro.

Avere una lettura di questi articoli:

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

+1

Funzionerà in modo asincrono. –

+0

Sarebbe strano che un'API di rete non funzioni in modo asincrono. Quindi sì, l'API NSURLSession è altamente asincrona: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa

+0

La gestione della parte del delegato è fastidiosa. –

Problemi correlati