有没有办法将方法作为块传递?
问题描述:
我讨厌块。它们旨在使代码更简洁,但我找不到更难看的东西。例如,对于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编程的未来,而且它们只是不可读。
答
所以你认为块结构使代码难以阅读? 我认为他们有时可以让事情变得更容易理解,尤其是在网络代码等异步情况下。
为了便于阅读,您可以将块分配给变量。 (事实上块是目标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
答
您可以剥离这些块,以便它们不是方法调用的内嵌参数。它仍然涉及一些块丑,但仍提高一些可读性:
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];
答
短块都不错,过长的人不是,您画线当然是个人喜好...
使用方法块并不难(周围的其他方法更多的是一种挑战)。 - 无论它是值得的,是给你
- (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];
哪种方法你选择的是一个风格问题。
起初,块可能看起来很丑,但它们很强大,有一些特定的原因,它们似乎是未来。我会建议你这篇文章有一个很好的见解:http://ios-blog.co.uk/articles/tutorials/programming-with-blocks-an-overview/ – Alladinian 2012-07-05 20:09:37
块不会使代码更简洁,他们使代码更强大。 – dreamlax 2012-07-05 20:30:42
我认为这是一个有效的问题。由于块既可以接收参数(0..n)并返回一个参数或void,方法应该可以用作块...或者换句话说,在类级定义块将会很好。我不认为你可以... – 2015-01-10 21:36:50