有没有办法将方法作为块传递?

ldi*_*ual 10 objective-c objective-c-blocks afnetworking

我讨厌块.它们旨在使代码更简洁,但我找不到更丑陋的东西.例如,使用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
}]
Run Code Online (Sandbox Code Playgroud)

这样的事情会好得多:

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
             requestsuccess:@selector(requestSuccess:response:json:)
                    failure:@selector(requestSuccess:response:error:)]
Run Code Online (Sandbox Code Playgroud)

那么,是否可以使用方法的选择器作为块?如果没有,我怎样才能使代码更好?

这让我感到很恼火,因为这些块似乎是Objective-c编程的未来,它们只是不可读.

Fel*_*lix 6

所以你认为块结构使代码更难阅读?我认为它们有时可以使事情更容易理解,尤其是在网络代码等异步环境中.

为了便于阅读,您可以将块分配给变量.(确实,块是客观的对象.)

例:

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];
Run Code Online (Sandbox Code Playgroud)

您还可以在块内调用单个处理程序方法以使其保持较小.