iphone - iOS - 将 block 传递给函数

标签 iphone objective-c afnetworking objective-c-blocks

我有一个方法调用(这是来自 AFNetworking 的调用):

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
                                     {
                                         NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);

                                     } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
                                     {
                                         NSLog(@"Failed: %@",[error localizedDescription]);
                                     }];

我正在尝试将成功和失败 block 拉出到一个单独的变量中,稍后我可以将其传递到方法中。但我不知道如何将 block 声明为变量。我想做这样的事情:

IDontKnowWhatKindOfDataTypeGoesHere successBlock = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
  NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);  
}

对于 failureBlock 也是如此。

那么我希望像这样调用 AFJSONRequestOperation:

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

但是我不知道successBlock和failureBlock的数据类型应该是什么。

我想这更多是为了组织。我的 successBlock 中有很多代码,Xcode 推送的自动格式化都在屏幕右侧,这非常烦人。所以如果我能把它拉出来(这应该是可能的,对吧),那么我就可以更好地组织我的代码。

谢谢!

最佳答案

在您习惯之前,这很尴尬。变量名称与类型混在一起...

void (^success)(NSURLRequest *, NSHTTPURLResponse *, id) = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
   NSLog(@"request is %@, response is %@ and json is %@", request, response, JSON);
};

本例中的栈变量名是success。您现在可以在采用相同类型的后续表达式中引用它,例如 ...

AFJSONRequestOperation *operation = [AFJSONRequestOperationJSONRequestOperationWithRequest:request
                                        success:success];

你也可以让一个 block 成为一个属性,像这样:

@property (copy, nonatomic) void (^success)(NSURLRequest *, NSHTTPURLResponse *, id);

然后这样调用它:

self.success(aRequest, aResponse, someJSON);

记得在完成调用后将其置零,这样调用者就不必担心创建保留周期。

编辑:关于使用 typedef 使眼睛和手指更轻松的评论中的好建议:

typedef void (^SuccesBlock)(NSURLRequest *, NSHTTPURLResponse *, id);

所以堆栈变量看起来像这样:

SuccessBlock success = ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
   NSLog(@"request is %@, response is %@ and json is %@", request, response, JSON);
};

属性看起来像这样:

@property (copy, nonatomic) SuccessBlock success;

关于iphone - iOS - 将 block 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18220645/

相关文章:

iphone - 开始按钮启动 NSTimer,停止按钮停止它,开始按钮再次启动它。但是 'invalidate' 给了我一个错误?

iphone - 在PhoneGap项目中找不到plist

iphone - 在加载另一个 ViewController 时呈现模态视图 Controller

ios - 对齐的阿拉伯语或波斯语文本或任何语言方向从右到左 - iOS

objective-c - clang (在 Xcode 中): start with -Weverything and manually disable particular warnings

iphone - 带有 json 反馈的 AFNetworking Post 请求

javascript - 单击一个 Div 下拉功能在 iPhone 上不起作用

iphone - sizeWithFont 之间的差异 :constrainedToSize:lineBreakMode: and textView. contentSize.height

ios - 使用 AFNetworking 加载图像 - 调整大小

ios - 找不到 AFHTTPClient.h 文件