objective-c - 有没有办法将方法作为 block 传递?

标签 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
}]

像这样的东西会好得多:

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

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

这让我很烦,因为这些 block 似乎是 objective-c 编程的 future ,而且它们只是不可读。

最佳答案

所以您认为 block 结构使代码更难阅读? 我认为它们有时可以使事情更容易理解,尤其是在网络代码等异步上下文中。

为了更容易阅读,您可以将 block 分配给变量。 (实际上 block 是 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];

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

关于objective-c - 有没有办法将方法作为 block 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351534/

相关文章:

ios - AFNetworking API 调用状态码

ios - 从 post 请求中解析 json ios afnetworking

ios - 如何向 uiviewcontroller 添加圆角半径

ios - 重新路由期间Skobbler API的问题

objective-c - 需要解释 for 循环中的 block 行为

ios - Objective-C block 。上下文捕获相同的变量/复制相同的 NSStackBlock

objective-c - 在 NSString 中搜索网页链接

objective-c - Objective C 在 UIWebView 中加载 PDF 文件

iphone - 在 Objective-C 中使用 block 而不是函数有优势吗?

ios - AFNetworking 中 UIImageView 的磁盘备份图像缓存