大容量ファイルのダウンロード処理
実装アプローチ:NSURLConnectionとデリゲートメソッドの活用
1. リクエストの発行処理
// 1.URLオブジェクトの生成
NSURL *targetURL = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos.zip"];
// 2.リクエストの構築
NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:targetURL];
// 3.接続の確立(非同期リクエストが自動的に開始される)
[NSURLConnection connectionWithRequest:downloadRequest delegate:self];
2. サーバーからの応答データをデリゲートメソッドで処理
/**
サーバーからレスポンスを受け取った際の処理:
1. 空のファイルを作成
2. ファイルハンドルオブジェクトでファイルと関連付け、後続の書き込み操作を容易にする
*/
- (void)connection:(NSURLConnection *)activeConnection didReceiveResponse:(NSURLResponse *)serverResponse
{
// キャッシュディレクトリのパス取得
NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileDestination = [cacheDir stringByAppendingPathComponent:@"videos.zip"];
// サンドボックス内に空ファイル作成
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fileDestination contents:nil attributes:nil];
// 書き込み用ファイルハンドルの初期化
self.fileWriteHandle = [NSFileHandle fileHandleForWritingAtPath:fileDestination];
}
/**
サーバーからデータブロックを受け取るたびに、ファイル末尾への追記処理を行う
*/
- (void)connection:(NSURLConnection *)activeConnection didReceiveData:(NSData *)receivedData
{
// ファイル末尾にカーソル移動
[self.fileWriteHandle seekToEndOfFile];
// 受信データをファイルに書き込み
[self.fileWriteHandle writeData:receivedData];
}
/**
全データ受信完了時のクリーンアップ処理
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)activeConnection
{
// ファイルクローズ処理
[self.fileWriteHandle closeFile];
self.fileWriteHandle = nil;
}
重要な注意事項:
サーバーからのデータ結合にNSMutableDataを使用してはいけません。これによりメモリ使用量が増加し、パフォーマンスに悪影響を与える可能性があります。
NSURLConnectionによる非同期リクエストの送信方法
1. ブロックベースの実装
大容量ファイルのダウンロード以外の通常操作にはこの形式を推奨します。
[NSURLConnection sendAsynchronousRequest:targetRequest
queue:operationQueue
completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
// 処理結果のコールバック
}];
2. デリゲートベースの実装
大容量ファイルのダウンロード処理にはこの形式を主に使用します。
// 1.URLの準備
NSURL *requestURL = [NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123"];
// 2.リクエストオブジェクトの作成
NSURLRequest *authRequest = [NSURLRequest requestWithURL:requestURL];
// 3.接続開始(インスタンス生成と同時に非同期リクエストが実行される)
[NSURLConnection connectionWithRequest:authRequest delegate:self];