0

Objective-cのブロックからのコールバックパラメータを使用して直接呼び出したいインスタンスメソッドがあります。コールバックで単純な1ライナー以上のことを行う必要がある場合は、このアプローチを好みます。

これが基本的なセットアップです...

ある種のコールバックを使用してクラスを初期化するので、httpリクエストでjsonを解析できます。

- (void)initFooAndDoStuff {
    Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){
        // do stuff
    }];
}

//this is the instance method I'd like to invoke instead of an inline function
- (void)callBackWithHttpResponse:(NSData *)response {
    // do stuff ... assuming it's more complex than a 1 liner that is
}

インラインで何かを行うコールバックを設定できます(ただし、スタンドアロンのインスタンスメソッドでは、より複雑なものの方が良いでしょう)

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    NSLog(@"foo"); 
}];

以下のようなインスタンスメソッドを使用できますが、少し時間がかかります。とにかく私はこれを減らすことができます(つまり構文)。

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}];
4

2 に答える 2

2

実装をメソッドに入れる場合は、メソッドにブロック全体を返すようにすることもできます。

-(void (^)(NSData *))httpResponseHandler {
    return ^(NSData *responseData){
        // do something with responseData
    };
}

次に、それを使用する場所はもう少し簡潔になります。

Foo *foo = [[Foo alloc] initWithCallback:[self httpResponseHandler]]; 
于 2012-06-18T17:02:48.410 に答える
1
Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}];

OK-それなりにかなり読みやすい。

さて、別の部屋に行って、レンガで3回頭を殴り、6か月から1年でこのプロジェクトを見なかったことをシミュレートします。

ここで、コードをもう一度読みます。

まだ読みやすいですね。

その冗長性がコードが何をしているのかを正確に示している場合、少しの冗長性に問題はありません。Ken Thomasesが提案したように、ターゲット/アクションパターンを使用することもできますが、それでは他の場所でさらに複雑にする必要があります。

の代わりにcallback、さらに具体的に変更します。つまり、コールバックが本当に完了ハンドラーだった場合:

Foo *foo = [[Foo alloc] initWithHTTPResponseCompletionHandler:^(NSData * response){ 
    [self httpResponseCompletionHandler:response]; 
}];
于 2012-06-17T00:09:43.280 に答える