Objective-Cで外部APIとの連携方法メモ

IPhoneアプリ用に外部APIとの連携を試してみたので、メモ。
twitterクライアントや簡易ゲームの得点一覧(保存、読み込み)などに利用できる。

httpリクエス

stringWithContentsOfURL:encoding:error:メソッド

○簡単にネットワーク上のテキスト情報を取得可能。
×データの取得が終わるまで処理が止まってしまう
(例)test.comのhtmlソースを取得する

-(void)viewDidLoad{
  NSURL *url = [NSULR URLWithString:@"http://test.com"];
  NSString *html = [NSString stringWithContentsOfURL:url encoding:エンコード error:nill];
}
NSURLRequestメソッド

○非同期にネットワークの情報を取得する事ができる
×処理がstringWithContentsOfURLに比べると複雑

(例)twitterAPIを利用して「変態仮面紳士」を検索する

-(void)viewDidLoad{
  NSString *searchString = @"変態仮面紳士";
  NSString *urlString = [NSString stringWithFormat:@"http://search.twitter.com/search.json?q=%@",searchString];
  NSURL *url = [NSURL URLwithString:urlString];
  //NSURLRequestクラスのインスタンスを生成
  NSURLRequest *req = [NSURLRequest requestWIthURL:url];
  //リクエスト情報を使って通信を行う
  NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
  if(conn == nil){return;}

  //4つのデリゲートメソッドを実装。
  //didReceiveResponse レスポンスの受け取りを開始したとき(データ受信準備)
  -(void)connection:(NSURLConnection *)connection didReceiveResponse{}

  //didReceiveData データを受信する(受信するデータによっては何度も呼ばれる)
  -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *){}

  //DidFinishLoading データ受信が成功したとき
  -(void)connectionDidFinishLoading:(NSURLConnection *)connection{}

  //didFailWithError データ受信が失敗したとき
  -(void)connection:(NSURLConnection *)connection didFailWIthError:(NSError)error{}
}

データの保持

NSMutableDataによるデータの保持

NSMutableData---変更可能なクラス
NSData---変更不可能なクラス
(例)受信したデータをインスタンスに追加するコード

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
	[receivedData appendData:data];
}
NSMutableArrayによるデータの保持

MSMutableArray---変更可能な配列
MSArray---変更不可能な配列
(例)受信したデータをインスタンスに追加するコード

NSArray *items = [result objectForKey:@"results"];
for(NSDictionay* tweet in items){
	NSLog(@"- %@",[tweet objectForKey:@"text"]);
	[tweetsArray addObject:[tweet objectForKey:@"text"]];
}

JSONの解析

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
  NSString *json = [[NSString alloc] initWithData:receivedData encoding NSUTF8StringEncoding];
  self.textField.text=json;

  NSDirectory *result = [json JSONValue];
  NSArray * items = [result object ForKey:@"results"];
  for(NSDictionary* tweet in items){
  	NSLog(@"- %@",[tweet objectForKey:@"text"]);
  }
}