assaulter's diary

主にバイクについて

iOSでデリゲートメソッドを書いてみる

仕様

  1. viewでボタンを押すと通信開始
  2. 通信を行う(今回は特にデータの取得は行わない)
  3. 通信が完了したらviewのラベルを変更する

シーケンス図

f:id:assaulter:20130112181809p:plain

 MyUrlConnectionクラスが通信を行なって、通信完了イベントを受け取るのですが、ラベル変更はViewの仕事なので、デリゲートメソッドという形で委譲します。

MyUrlConnectionクラス(一部)

MyUrlConnection.h

#import 
// 通信完了したらやってほしいことがあるけど、実装はそっちまかせ
@protocol MyUrlConnectionDelegate 
-(void)didFinishedLoad;
@end

@interface MyUrlConnection : NSObject

- (void)startConnection;
@property (nonatomic,weak) id delegate;

@end

MyUrlConnection.m

// データを全て受け取ると呼び出される
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.delegate didFinishedLoad];
    NSLog(@"didFinishLoading");
}

UIViewControllerクラス(一部)

Step1.h

#import 
#import "MyUrlConnection.h"

@interface Step1 : UIViewController

@property (nonatomic, weak) IBOutlet UILabel* label;
- (IBAction)clickButton:(UIButton*)sender;
@end

Step1.m(一部)

// ボタンがクリックされたらここ
- (IBAction)clickButton:(UIButton*)sender {
    [urlConect startConnection];
}

// 通信終了のお知らせ(MyUrlConnectionのデリゲートメソッド)
-(void)didFinishedLoad {
    // labelのテキストを変更する
    self.label.text = @"did finished load";
}

こうやるとdelegateを実装している誰かに対して仕事を投げつけることができるわけですね。わかります。

参考資料

Objective-Cのdelegateの機能を理解する