iOSにおけるNSURLConnectionの使用方法と実装パターン

大容量ファイルのダウンロード処理

実装アプローチ: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];

タグ: iOS NSURLConnection 非同期通信 ダウンロード デリゲートパターン

7月22日 20:22 投稿