これを行う1つの方法があります。このRAExpendableクラスを使用して、ブロックベースの実装でデリゲートを動的に構築します。
代理人が次のようになっているとしましょう。
@protocol XDelegate
-(void) foo:(id)response;
@end
https://github.com/evadne/RAExpendableからRAExpendable.h、RAExpendable.mをプロジェクトに追加します。デリゲートメソッドを動的に追加します。
RAExpendable *expendable = [RAExpendable new];
[expendable addMethodForSelector:@selector(foo:) types:"v@:@" block:^(id x, SEL sel, id response){
NSLog(@"response is %@", response);
}];
そして、expendable
クラスをデリゲートとして設定します。
someObject.delegate = expendable;
さて、これを行うと:
[expendable performSelector:@selector(foo:) withObject:@"OK"];
文字列を取得しますresponse is OK
。NSLogを、適切と思われる成功/失敗の実装に置き換えます。これ以降、を呼び出すとfoo:
、代わりにブロックが実行されます。
ユースケースに合わせてこれを変更する場合は、この例のパラメーターがであることに注意してください。これは、ランタイムのタイプエンコーディングv@:@
ガイドによると、void return、self、SEL、objectを意味します。とはすべてのObjective-Cメソッドに存在する2つの非表示パラメーターであり、3番目のパラメーターはメソッドの最初の非表示パラメーターです。ブロックのシグニチャは、メソッドのシグニチャと一致する必要があります。self
SEL