2011-03-16 11 views

cevap

144

Ben, ancak Web'den bir dosya almak ve yerel olarak saklamak ne wget emin değilim, sen NSData kullanabilirsiniz:

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

Sadece merak, bu engelleme olup olmadığını:

bu makalelerin bir okuma var mı? Bunun bir blok olduğunu varsayardım. – schystz

+6

@schystz Eğer bloke ederek senkronize ediyorsanız, o zaman evet. – carlossless

+0

Benzer şekilde, bir kişi de ilgilenebilir '+ [NSString stringWithContentsOfURL: kodlama: hata:]' – Zmaster

6

Ben çok daha kolay bir yolu ASIHTTPRequest kullanmak olduğunu düşünüyorum. Bu başarabilirsiniz kod Üç hatları:

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

Link to Reference

GÜNCELLEME: Ben ASIHTTPRequest artık korunur bahsetmeliyiz. Yazar, özellikle insanlara diğer framework'ü kullanmasını tavsiye etti, AFNetworking

1

Bundan başka, kullanımı kolay bir "indirme yöneticisi" kitaplığı uyguladım: PTDownloadManager. Bir şans verebilirsin!

+0

Çok hoşunuza. Teşekkürler. –

0

pek çok yolu vardır:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget, güçlü özelliklere sahip bir ticari tek.

+0

ASIHTTP hala bir yerlerde destekleniyor mu? Web sitesi başka bir şeyin kullanılmasını önerir: http://allseeing-i.com/ASIHTTPRequest/ – Robert

+1

Hayır. ASIHTTP'yi kullanmayın. Yüksek düzeyli bir araç için bunun yerine AFNetworking kullanın: https://github.com/AFNetworking/AFNetworking – GnarlyDog

13

bir tamamlama bloğu kullanılarak bir asenkron erişimi olur.

Bu örnek cihazın belge dizinine Google logosunu kaydeder. (IOS 5+, OSX 10.7+) NSURLSession iOS 7 tanıtıldı

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

, bir dosya indirme önerilen SDK'dır yoludur. 3. parti kütüphaneleri ithal etmeye gerek yok.

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

Ardından hataları, indir tamamlama, indirme ilerleme vb izlemek için NSURLSessionDownloadDelegate temsilci yöntemleri kullanabilirsiniz ... tercih de eğer inline blok tamamlama işleyici geri arama yöntemi vardır. Elma doktorları, diğerini kullanmanız gerektiğinde bunu açıklar.

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

+1

Bu, uyumsuz bir şekilde çalışacak mı –

+0

Bir Ağ API'sinin senkronize olmayan bir şekilde çalışmaması garip olur. Evet, NSURLSession API'sı çok eşzamansızdır: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa

+0

Temsilci bölümünün ele alınması can sıkıcıdır. –