2012-07-05 9 views
9

ブロックが嫌いです。彼らはコードをより簡潔にすることを意図していますが、私はもっと醜い何かを見つけることができませんでした。例えば、AFNetworkingで:メソッドをブロックとして渡す方法はありますか?

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 
        failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) { 
    // Failure code 
}] 

このような何かがはるかに優れただろう:

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:@selector(requestSuccess:response:json:) 
        failure:@selector(requestSuccess:response:error:)] 

だから、それはブロックとして、メソッドのセレクタを使用することは可能でしょうか?もしそうでなければ、どうすればブロックコードを改善できますか?

私は、これらのブロックがobjective-cプログラミングの未来であると思われていて、読めるわけではないので、私を悩ましています。

+3

最初はブロックが「醜い」と思われるかもしれませんが、それらは強力で、特定の理由で「未来」と思われます。私は良い記事をお勧めします:http://ios-blog.co.uk/articles/tutorials/programming-with-blocks-an-overview/ – Alladinian

+1

ブロックはコードを簡潔にしません。より強力なコード。 – dreamlax

+0

これは有効な質問です。ブロックはパラメータ(0..n)を受け取り、パラメータまたはvoidを返すことができるので、メソッドをブロックとして使用できるようにするか、別の方法で置くことができます。クラスレベルでブロックを定義するとよいでしょう。私はあなたができるとは思わない... –

答えて

6

ブロックの構造によってコードが読みにくくなると思いますか? 私は時にはネットワークコードのような非同期の文脈で、時々物事を理解しやすくすることができると思います。

読みやすくするために、ブロックを変数に割り当てることができます。 (実際のブロックはObjective-Cのオブジェクトである。)

例:

typedef void(^SuccessBlock)(NSURLRequest *request, NSURLResponse *response, id JSON); 

SuccessBlock successBlock = ^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // code block 
}; 

AFJSONRequestOperation* operation; 
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                  success:successBlock 
                  failure:nil]; 

また、小さなそれを維持するためにブロック内の単一のハンドラメソッドを呼び出すことができます。

+0

それは "スタイル"の問題の多くを修正し、私はそれが行くための最良の方法だと思う。ありがとう! –

1

ブロックを外して、メソッド呼び出しのインラインパラメータにしないようにすることができます。まだブロックの醜さがありますが、可読性が向上しています。

void (^successBlock)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON); 

successBlock =^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
}; 
//do same for failure block as "failureBlock" 
... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:successBlock 
        failure:failureBlock]; 
1

ショートブロックがブロックするための方法を使用して

難しいことではありません...個人的な好みはもちろんである、あなたは線を引く過度に長いものではない、良いです(他の方法は、周りの詳細ですチャレンジ)。最も簡単な方法は、あなたの方法を使用したい場合:

- (void) requestSuccess:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        json:(id)JSON 
{ 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 

- (void) requestFailure:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        error:(NSError **)error 
        json:(id)JSON 
{ 
    // Failure code 
} 

... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) 
     { 
      [self requestSuccess:request response:response json:JSON]; 
     } 
     failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) 
     { 
      [self requestFailure:request response:response error:error json:JSON]; 
     }] 

あなたも、マクロ、またはperformSelector/NSInvocation楽しさをさらに行くことができる - それはあなた次第です価値があるかどうかを。あなたはまたの線に沿って、コール自体の前にブロック定義を移動することができます

:あなたが選択したアプローチ

var = block; 
[object method:var]; 

はスタイルの問題です。

関連する問題