はてなブックマークに追加

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
はてなブックマークに追加

iPhoneネットワークプログラミング その4



サイトを移行しました。
iPhoneアプリと、そのプログラム



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

このように、一度に複数のHTTPリクエストを処理したい時には
NSOperationクラスを使用して、処理の流れを操作します。

NSOperationクラスはメソッド呼び出しなどを
独立した操作としてカプセル化するクラスであり、
通常はこのクラスのサブクラスを作成して使用します。

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

下に、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ネットワークプログラミング その5

スポンサーサイト

コメントの投稿

非公開コメント

開発アプリ

iDOF 色影 ラテアート ぱすてる

プロフィール

hokuson

Author:hokuson
京都在住。iPhoneアプリ「色影」や「iDOF」の開発者。アプリのレビューとかもしてみる。博士後期課程@R大学。ついに就職活動なるものをしなければいけないらしい。誰か雇ってください。笑。

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
カテゴリ
最新コメント
RSSリンクの表示
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。