iPhoneネットワークプログラミング(複数ファイルDL)

このエントリーを含むはてなブックマークはてなブックマーク - iPhoneネットワークプログラミング(複数ファイルDL)

これまでは、一度にひとつのページしかダウンロードしませんでしたが、ブラウザで同時に複数のタブを開くときなどには、一度に複数のファイルをダウンロードする必要があります。

このように、一度に複数のHTTPリクエストを処理したい時にはNSOperationクラスを使用して、処理の流れを操作します。NSOperationクラスはメソッド呼び出しなどを独立した操作としてカプセル化するクラスであり、通常はこのクラスのサブクラスを作成して使用します。

イメージ、こんな感じ。
nsoperation

下に、NSOperationを継承したサブクラスを示します。

RequestOperation.h

@interface RequestOperation : NSOperation {
	NSURLRequest*  _request;
	NSMutableData* _data;
}
- (id)initWithRequest:(NSURLRequest *)request;
@end

RequestOperation.m

@implementation RequestOperation
- (id)initWithRequest:(NSURLRequest *)request {
	if (self = [self init]) {
		_request = [request retain];
		_data = [[NSMutableData data] retain];
	}
	return self;
}

- (BOOL)isConcurrent {
	return YES;
}

- (void)start {
	if (![self isCancelled]) {
		[NSURLConnection
		 connectionWithRequest:_request delegate:self];
	}
}

- (void)connection:(NSURLConnection*)connection
    didReceiveData:(NSData*)data {
	[_data appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
	NSLog(@"%@", [[NSString alloc] initWithData:_data 
		encoding:NSASCIIStringEncoding]);
}


- (void)dealloc {
	[_request release];
	[_data release];
	[super dealloc];
}
@end

プログラムの内容は殆どの部分が、これまで書いてきたものをNSOperationの中に詰め込んだだけになっています。startとisConcurrentメソッドは、それぞれNSOperationクラスのもつメソッドをオーバライドしたものです。

startメソッドは処理の開始時に呼ばれるメソッドであり、この中で、NSURLConnectionクラスの設定を行っています。また、isConcurrentメソッドは非同期通信を行うかどうかのフラグを返すメソッドであり、このプログラムではYESを返しています。

ここまでで、NSOperationのサブクラスは完成したので、このクラスを呼び出して、複数HTTPリクエスト処理してみます。ドライバプログラムはいつもどおりViewControllerのviewDidLoadメソッドの中に記述します。

SampleViewController.m

- (void)viewDidLoad {
	[super viewDidLoad];
	_queue = [NSOperationQueue mainQueue];

	NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];      
	RequestOperation* operation = [[RequestOperation alloc] initWithRequest:request];
	[operation autorelease];
	
	NSURLRequest* request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.yahoo.co.jp"]];      
	RequestOperation* operation2 = [[RequestOperation alloc] initWithRequest:request2];
	[operation2 autorelease];

	[_queue addOperation:operation];
}

はじめに、処理を追加する待ち行列NSOperationQueueを作成しています。次に、2つのHTTPリクエストを作成し、先程作成したQueueに追加します。これで、実行すれば自動的にリクエストが順番に処理されていきます。

次回はXMLのパースについてのおはなし
iPhoneネットワークプログラミング(XMLパース)

3 Responses to “iPhoneネットワークプログラミング(複数ファイルDL)”

  1. [...] iPhoneアプリと、そのプログラム iPhoneアプリを作る際に役立つプログラムを置いています コンテンツへ移動 ホーム紹介 ← iPhoneネットワークプログラミング(複数ファイルDL) [...]

  2. [...] iPhoneネットワークプログラミング(複数ファイルDL) iPhoneネットワークプログラミング(XMLパース) [...]

  3. [...] iPhoneネットワークプログラミング(複数ファイルDL) iPhoneネットワークプログラミング(XMLパース) [...]

Leave a Reply

You must be logged in to post a comment.