やんだー制作、新WEBサービス!2014/11/15 OPEN!!

あにめに(β) OPEN!!

あにめに(β)とは、マンガにアフレコをして、アニメのようなに楽しむサービスです。

声優を目指すユーザ、
漫画家を目指すユーザ、
そして、アニメが好きなユーザ...必見です!
<< [同期通信] Objective-CからPHP経由でDB接続して情報を取得する方法 | top | [Objective-C] で文字列からメソッドを特定して実行する方法 >>

[非同期通信] Objective-CからPHP経由でDB接続して情報を取得する方法

こんばんわ。やんだーです。

今回は、前回記述した、
「同期通信でObjective-CからDB情報(mysql)を取得して、TableViewに表示するプログラム」
非同期通信版を記述したいと思います。


まあ前回の同期処理に非同期で処理するプログラムを追加するだけなんですが...


NSURLConnection *conect = [NSURLConnection connectionWithRequest:***** delegate:*****];


上記で非同期通信を実行します。
あとは4つのメソッドを記述しておけばOKです。

4つのメソッドは、
接続成功し、レスポンスが返ってきた時
サーバからデータが送られた時
データ受信が完了した時
通信失敗時

<解説>
は、最初の接続で呼び出されます。

は、データが送られた際に呼び出されます。(複数実行される場合あり
 ただし、データ量が多い場合は小分けにして送られるので、小分けにされた回数だけ呼ばれます。
 数回にわたりデータが送られてくる可能性があるので、ここで受信するたびにデータを結合していく。

は、データを全て受信し終わった際に呼ばれます。これが実行されれば成功です。

は、こちらはエラー時に呼ばれます。
 URL先がなかったり、何かしら通信でエラーが起こった際の処理を記述します。

実行順番としては、

開始  →  →  →  → ・・・(全データ受信したら) →  終了

は終了するまでエラーが出た際に呼び出されます。


下記がサンプルソースです。

.hファイル
// ~省略~

@interface Test_TVC : UITableViewController<NSXMLParserDelegate> {
    //xml解析で使用
    NSString *nowTagStr;
    NSString *txtBuffer;
    
    //ユーザ名を格納する配列  
    NSMutableArray *userArr;
    
    //xmlの数を入れる数値
    NSInteger xml_index;
    
    
    //通信コネクト
    NSURLConnection *conect;
    
    //受信データ
    NSMutableData *data;
    
    //LoadingView(通信中にぐるぐる回るやつ)
    UIView *uv_load;
    
}

// ~省略~

赤字が今回追加したものです。




.mファイル
// ~省略~

// 初期読込
- (void)viewDidLoad
{
    [super viewDidLoad];

    //ユーザ名格納配列 初期化
    userArr = [[NSMutableArray alloc] init];
    
    //配列番号
    xml_index = 0;
    
    
    //PHPファイルのURLを設定
    NSString *url =@"http://www.test_exsample.com/index.php";//ここにはそれぞれのPHPファイルのURLを指定して下さい
    
    //非同期通信 準備
    NSURL *myURL = [NSURL URLWithString:url];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:myURL];
    
    //非同期通信 開始
    conect = [NSURLConnection connectionWithRequest:urlRequest delegate:self];    


    //Loadingを表示するView(通信中にぐるぐる回るやつ) 設定
    UIScreen *sc = [UIScreen mainScreen];
    uv_load = [[UIView alloc] initWithFrame:CGRectMake(0,0,sc.applicationFrame.size.width, sc.applicationFrame.size.height)];
    uv_load.backgroundColor = [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.7];
    
    //ぐるぐる回る
    UIActivityIndicatorView *aci_loading;
    aci_loading = [[UIActivityIndicatorView alloc] init];
    aci_loading.frame = CGRectMake(0,0,sc.applicationFrame.size.width, sc.applicationFrame.size.height);
    aci_loading.center = uv_load.center;
    aci_loading.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    [aci_loading startAnimating];
    
    //Loading表示
    [uv_load addSubview:aci_loading];
    [self.view addSubview:uv_load];
}


// ~省略~


// XMLの解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    //解析中タグの初期化
    nowTagStr = @"";
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    
    //開始タグが user の場合
    if ([elementName isEqualToString:@"user"]) {
        //解析中タグに設定
        nowTagStr = [NSString stringWithString:elementName];
        
        //テキストバッファの初期化
        txtBuffer = @"";
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    
    //解析中のタグが user の場合
    if ([nowTagStr isEqualToString:@"user"]){
        //テキストバッファに文字を追加する
        txtBuffer = [txtBuffer stringByAppendingString:string];
    }
}

- (void)parser:(NSXMLParser *) parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    
    //終了タグが user の場合
    if ([elementName isEqualToString:@"user"]) {
        NSString *xml_name =txtBuffer;
        
        //userArrにユーザ名を格納
        [userArr insertObject:xml_name atIndex:xml_index];
        
        xml_index++;
    }
}


// ~省略~


// Tableviewの設定
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    //section数
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //cell数
    return [userArr count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    
    //indexPathよりrowを取得し、rowをもとにuserArr配列から街頭するユーザ名を取得
    cell.textLabel.text = [userArr objectAtIndex:indexPath.row];
    
    
    return cell;
}


// ~省略~


//非同期通信メソッド
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    // ① 接続成功し、レスポンスが返ってきた時
   
    //受信データ格納変数 初期化
    data = [[NSMutableData alloc] init];
}


- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)receivedData {
    // ② サーバからデータが送られた時
    
    //データを結合
    [data appendData:receivedData];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    // ③ データ受信が完了した時
        
    //受信データを文字列として確認
    NSString *respons_str = [[NSString alloc]initWithData:data
                                                 encoding:NSUTF8StringEncoding];
    NSLog(@"res=%@", respons_str);

    //xmlパーサー生成
    NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:data];
    myParser.delegate = self;
    
    //xml解析開始
    [myParser parse];
    
    //tableviewを再描画
    [self.tableView reloadData]; // ←ここが重要!(tableを再描画しないとxmlのデータが反映されません。)
    
    //Loading非表示
    uv_load.hidden = true;
}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    // ④ 通信失敗時
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"エラー" message:@"通信に失敗しました。" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}


// ~省略~


viewDidLoadの赤字オレンジ色の文字が、viewDidLoadに追加したものです。

また、非同期通信メソッドの4つのメソッド(青色)も
今回追加した部分になります。

.phpファイル(xml形式)
<?xml version="1.0" encoding="utf-8"?>
  <data>
    <user>太郎</user>
    <user>じろう</user>
    <user>Saburo</user>
  </data>

前回と全く一緒!


実行画面はこんな感じです。
実行画面1 →  実行画面2


以上です。
このエントリーをはてなブックマークに追加  
やんだー | Objective-C | 00:42 | comments(0) | - | - |
Comment










08
--
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
--
>>
<<
--
おすすめリンク
やんだーの家
http://www.randy-boy.com/
ブログ筆者やんだーの
所属プロジェクト「RandY boy」
のページです。
ぜひ、見ていってやって下さい。

Twitter: やんだー
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH