iOSでデリゲートメソッドを書いてみる
仕様
- viewでボタンを押すと通信開始
- 通信を行う(今回は特にデータの取得は行わない)
- 通信が完了したらviewのラベルを変更する
シーケンス図
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を実装している誰かに対して仕事を投げつけることができるわけですね。わかります。