2012-07-05 101 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 2012-07-05 20:09:37

+1

块不会使代码更简洁,他们使代码更强大。 – dreamlax 2012-07-05 20:30:42

+0

我认为这是一个有效的问题。由于块既可以接收参数(0..n)并返回一个参数或void,方法应该可以用作块...或者换句话说,在类级定义块将会很好。我不认为你可以... – 2015-01-10 21:36:50

回答

6

所以你认为块结构使代码难以阅读? 我认为他们有时可以让事情变得更容易理解,尤其是在网络代码等异步情况下。

为了便于阅读,您可以将块分配给变量。 (事实上​​块是目标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

它修复了很多“风格”问题,我认为这是最好的方法。谢谢 ! – 2012-07-06 16:55:24

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]; 

哪种方法你选择的是一个风格问题。

相关问题