私はObjective-Cを初めて使いました。ウェブからファイルをダウンロードしたい場合(ウェブサーバー上で変更された場合)、アプリケーションで使用できるようにローカルに保存します。目的Cを使用してiOS上でローカルにファイルをダウンロードして保存するにはどうすればよいですか?
主に、wget --timestamp <url>
の機能を実装したいと思います。
私はObjective-Cを初めて使いました。ウェブからファイルをダウンロードしたい場合(ウェブサーバー上で変更された場合)、アプリケーションで使用できるようにローカルに保存します。目的Cを使用してiOS上でローカルにファイルをダウンロードして保存するにはどうすればよいですか?
主に、wget --timestamp <url>
の機能を実装したいと思います。
私は何の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];
}
私はもっと簡単な方法がASIHTTPRequestを使用することだと思います。
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/path/to/my_file.txt"];
[request startSynchronous];
UPDATE::私はASIHTTPRequestがもはや維持されていることは言うべきではありません3行のコードは、これを達成することができます。作者は特に、人々に代わりに他のフレームワークを使用するようにアドバイスしました。AFNetworking
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);
}
}];
の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のドキュメントでは、どちらか一方を使用する必要がある場合について説明しています。
これは非同期で動作します –
ネットワークAPIが非同期に動作しないことは奇妙です。したがって、NSURLSession APIは非常に非同期です。https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html – bandejapaisa
デリゲート部分の処理は面倒です。 –
ただ、不思議、このブロッキングがあるかどうか:
は、これらの記事の読み取りをお持ちですか?私はこれが1ブロックと仮定する。 – schystz
@schystzあなたがブロックすることによって同期していれば、そうです。 – carlossless
同様に、 '+ [NSString stringWithContentsOfURL:encoding:error:]'にも興味があります。 – Zmaster