3. 2時間で覚えるObjective-C |
---|
|
メソッド呼びだしとクラス定義 |
---|
|
Objective-Cの基本事項のまとめ |
---|
|
Objective-Cのサンプルプログラム |
---|
#import <stdio.h> #import <Foundation/Foundation.h> int main(int argc, char *argv[]) { int rv = 0; id pool = [NSAutoreleasePool new]; { if (argc != 2) { NSString *msg = [NSString stringWithFormat: @"usage: %s url_string", argv[0]]; printf("%s\n", [msg UTF8String]); rv = 1; goto out; } NSString *address = [NSString stringWithCString: argv[1]]; NSURL *url = [NSURL URLWithString: address]; NSURLRequest *request = [NSURLRequest requestWithURL: url]; NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; if ([[error localizedDescription] length] > 0) { NSLog(@"ConnectionError: %@", [error localizedDescription]); rv = 2; goto out; } [data writeToFile: @"output.dat" atomically: YES]; } out: [pool release]; return rv; } |
サンプルプログラムの解説 |
---|
|
NSURLConnectionの同期通信と非同期通信 |
---|
|
NSURLConnectionの非同期通信のDelegate |
---|
/usr/local/GNUstep/System/Library/Headers/Foundation/ |
NSURLConnectionのDelegate実装例 |
---|
@interface MyConnectDelegate : NSObject { // 更新可能なバイナリデータ格納用オブジェクト NSMutableData *result; } @end @implementation MyConnectDelegate - (void)connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { NSLog(@"didRecieveResponse: %@", response); // レスポンスを受け取ったらNSMutableDataインスタンス生成 result = [[NSMutableData alloc] init]; } - (void)connection: (NSURLConnection *)connection didReceiveData: (NSData *)data { NSLog(@"didReceiveData"); // データを受け取ったらNSMutableDataインスタンスへ追加 [result appendData: data]; } - (void)connectionDidFinishLoading: (NSURLConnection *)connection { NSLog(@"connectionDidFinishLoading"); // ロードが完了したらファイルへ出力 [result writeToFile: @"output.dat" atomically: YES]; } @end |
NSURLConnectionでPOSTメソッドのリクエストを送信 |
---|
NSString *address = @"http://localhost:8180/roomReservation/login2.jsp"; NSURL *url = [NSURL URLWithString: address]; // POSTデータを作成 NSString *param = @"user_name=iwasaki&mail_address=iwasaki@freebsd.org"; NSData *body = [param dataUsingEncoding: NSUTF8StringEncoding]; // 更新可能なrequest NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: url]; [request setHTTPMethod: @"POST"]; [request setValue: @"application/x-www-form-urlencoded" forHTTPHeaderField: @"content-type"]; [request setHTTPBody: body]; NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; |
[演習]Objective-C |
---|
サンプルプログラムで解説したurlget.mは、引数で指定されたURLにアクセスして コンテンツをファイルoutput.datに格納する。 生成されたoutput.datのサイズが正しいかを確認できるよう、レスポンスの ContentLengthをコンソールに出力するよう修正せよ。 $ ./urlget http://localhost:8180/ urlget2.mはDelegateを使用したサンプルプログラムの非同期通信版である。 GUIアプリケーションでは同期通信をおこなうと画面表示処理が止まってしまうため、 非同期通信をおこなうことが多い。 urlget2.mの実行中にダウンロードの進行状況をパーセント表示するよう、プログラムを修正せよ。 $ ./urlget2 http://localhost:8180/docs/changelog.html [snip] 44 % completed (116768 / 260027 bytes) [snip] 100 % completed (260027 / 260027 bytes) urlget2の非同期通信中にエラーが発生した場合でも、プログラムの終了コードは0となってしまう。 実行ループ終了後にDelegateから通信成功/失敗のステータスを取得できるようにし、失敗していた場合に終了コード3となるようにプログラムを修正せよ。 logincheck.mは会議室予約システムのアカウントログイン確認プログラムである。 http://localhost:8180/roomReservation/login2.jspをターゲットに引数で指定されたuser_nameとmail_addressをPOSTメソッドで送信する。 ログイン後の遷移先コンテンツに文字列「List of rooms」が含まれるか否かでログイン成否を判断している。 現状このプログラムは未完成であるが、正しく動作するようプログラムを修正せよ。 $ ./logincheck iwasaki iwasaki@freebsd.org |