2011-03-16 13 views

Odpowiedz

144

Nie jestem pewien, co wget jest, ale aby pobrać plik z internetu i przechowywać je lokalnie, można użyć 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

prostu zastanawiasz się, czy to blokowanie, czy nie? Zakładam, że ten blokuje. – schystz

+6

@schystz, jeśli przez blokowanie masz na myśli synchroniczne, to tak, jest. – carlossless

+0

Podobnie, może być także zainteresowany '+ [NSString stringWithContentsOfURL: encoding: error:]' – Zmaster

6

myślę, że o wiele łatwiej sposobem jest użycie ASIHTTPRequest. Trzy linie kodu można to osiągnąć:

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

Link to Reference

UPDATE: Należy wspomnieć, że ASIHTTPRequest nie jest już aktualizowany. Autor wyraźnie zalecił innym korzystanie z innych frameworków, np. AFNetworking

1

Jakiś czas temu zaimplementowałem łatwą w użyciu bibliotekę "menedżera pobierania": PTDownloadManager. Możesz dać mu szansę!

+0

Bardzo miło z twojej strony. Dzięki. –

0

Jest tak wiele sposobów:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget, jeden handlowych z zaawansowanych funkcji.

+0

czy ASIHTTP jest nadal obsługiwane? Strona internetowa zaleca użycie czegoś innego: http://allseeing-i.com/ASIHTTPRequest/ – Robert

+1

Nie. Nie używaj ASIHTTP. Aby uzyskać narzędzie o wysokim poziomie, użyj AFNetworking zamiast: https://github.com/AFNetworking/AFNetworking – GnarlyDog

13

chciałbym użyć asynchroniczny dostęp za pomocą bloku zakończenia.

W tym przykładzie zapisujemy logo Google w katalogu dokumentów urządzenia. (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 wprowadzony w iOS 7 jest zalecany SDK sposób pobierania pliku. Nie ma potrzeby importowania bibliotek innych firm.

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

Następnie można użyć metody delegata NSURLSessionDownloadDelegate do monitorowania błędów, ukończenie Download, postęp etc ... Istnieje inline metody zakończenia blok obsługi wywołań zwrotnych zbyt jeśli wolisz. Jabłka docs wyjaśnia, kiedy trzeba użyć jednego na drugim.

Mają czytać tych artykułów:

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

+1

Czy to zadziała asynchromnie –

+0

Byłoby dziwne, gdyby interfejs sieciowy nie działał asynchronicznie. Więc tak, interfejs API NSURLSession jest wysoce asynchroniczny: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa

+0

Obsługa części delegatów jest denerwująca. –

Powiązane problemy