2011-03-16 7 views

答えて

144

私は何のwgetでわからないんだけど、ウェブからファイルを取得し、それをローカルに保存するために、あなたがた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

ただ、不思議、このブロッキングがあるかどうか:

は、これらの記事の読み取りをお持ちですか?私はこれが1ブロックと仮定する。 – schystz

+6

@schystzあなたがブロックすることによって同期していれば、そうです。 – carlossless

+0

同様に、 '+ [NSString stringWithContentsOfURL:encoding:error:]'にも興味があります。 – Zmaster

6

私はもっと簡単な方法がASIHTTPRequestを使用することだと思います。

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

Link to Reference

UPDATE::私はASIHTTPRequestがもはや維持されていることは言うべきではありません3行のコードは、これを達成することができます。作者は特に、人々に代わりに他のフレームワークを使用するようにアドバイスしました。AFNetworking

1

いつか使いやすい "ダウンロードマネージャー"ライブラリ:PTDownloadManagerを実装しました。あなたはそれを撃つことができます!

+0

あなたの非常にいいです。ありがとう。 –

0

は非常に多くの方法があります。

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget、強力な機能を備えた商用1。

+0

はまだどこかでサポートされているASIHTTPですか?ウェブサイトは他のものの使用を勧告しています。http://allseeing-i.com/ASIHTTPRequest/ – Robert

+1

No. ASIHTTPを使用しないでください。高レベルのツールでは、代わりにAFNetworkingを使用してください:https://github.com/AFNetworking/AFNetworking – GnarlyDog

13

Iは完了ブロックを使用非同期アクセスを使用するであろう。

この例では、Googleロゴをデバイスのドキュメントディレクトリに保存します。 (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

のiOS 7で導入されたNSURLSessionは、ファイルのダウンロードの推奨SDKの方法です。サードパーティライブラリをインポートする必要はありません。

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

あなたは、その後のエラー、ダウンロード完了、ダウンロードの進行状況などを監視するためにNSURLSessionDownloadDelegateのデリゲートメソッドを使用することができます...あなたが好むすぎた場合、インラインブロック終了ハンドラのコールバックメソッドがあります。 Applesのドキュメントでは、どちらか一方を使用する必要がある場合について説明しています。

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

+1

これは非同期で動作します –

+0

ネットワークAPIが非同期に動作しないことは奇妙です。したがって、NSURLSession APIは非常に非同期です。https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa

+0

デリゲート部分の処理は面倒です。 –

関連する問題