6

さまざまなタイプのリクエストを送信するためのデリゲートベースのシステムを持つクラスがあります。デリゲートを使用して、要求が完了したとき、およびそれが成功したかどうか、またはエラーであるかどうかをオブジェクトに通知します。

さて、適切な行動を取るために、どのような種類の要求があったかを確認する必要もあります。

同じためのブロックベースのインターフェイスを提供するラッパークラスがあります。

完了ブロックとエラーブロックを、このデリゲートベースのクラスを内部的に使用する必要がある要求メソッドに渡します。

そして、応答が来たら、成功とエラーに応じて、その要求タイプに適切なハンドラーを自動的に呼び出す必要があります。

SOについても同様の質問がありましたが、少しわかりにくいので、すぐに重複としてマークするのではなく、一般的な考え方を教えてください。

4

2 に答える 2

2

REKitを使用すると、次のように動的にデリゲートを作成できます。

id dynamicDelegate;
dynamicDelegate = [[NSObject alloc] init];
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) {
    NSLog(@"response is %@", response);
}];
someObject.delegate = dynamicDelegate;
于 2013-02-14T11:40:22.650 に答える
2

これを行う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番目のパラメーターはメソッドの最初の非表示パラメーターです。ブロックのシグニチャは、メソッドのシグニチャと一致する必要があります。selfSEL

于 2013-01-04T11:58:31.340 に答える