2012年2月23日木曜日

SOAPリクエストとの同期


NSURLConnection によるネットワークへのリクエスト/レスポンスは非同期で実行されます。
UITableViewCellが選択されたときにSOAPリクエストを送信すると同時に次の画面へ移動するという処理を行う場合、画面移動時点ではまだデータがないため、いったん空の画面の移動し、受信完了後に画面表示を行います。

//Cell選択時にUITebleViewContollerからUIWebViewを持つUIViewControllerへ移動します。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyWebViewController *vCtr = [[self storyboard] instantiateViewControllerWithIdentifier:@"MyWebViewController"];
    [self.navigationController pushViewController:vCtr animated:YES];
}

//UIViewControllerがNSConnectionのdelegateになっているとします。
//受信完了時のdelegateメソッドで画面表示を行います。
-(void)connectionDidFinishLoading:(NSConnection*)connection
{
     NSData *binData = [<受信したSOAPレスポンスからバイナリデータを復元>];
     UIWebView *webView = (UIWebView *)[self view]; //self = anUIViewController
     //PDFの場合
      [(UIWebView *)[self view] loadData:binData MIMEType:@"application/pdf"
                                                               textEncodingName:nil baseURL:nil];
}

なお、NSURLConnectionによるリクエスト/レスポンスは非同期で実行されるので、この呼び出しを更にNSOperationQueueに入れたタスクから呼び出すととフリーズしたりします。

関連Blog

iOS アプリからのSOAP/WebServiceへのアクセス
SOAP レスポンスの受信
SOAP レスポンスのパース
バイナリデータのSOAPレスポンス
SOAPリクエスト/レスポンスとの同期

0 件のコメント: