iOS - 将块传递给函数

时间:2013-08-13 22:59:59

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

我正在尝试将成功和失败块移到一个单独的变量中,以后我可以将其传递给该方法。但我无法弄清楚如何将块声明为变量。我想做这样的事情:

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推送的自动编码都在屏幕的右侧,这完全令人讨厌。所以如果我能把它拉出来(这应该是可能的,那么),那么我可以更好地组织我的代码。

谢谢!

1 个答案:

答案 0 :(得分:6)

直到你习惯了它才很尴尬。变量名称与类型...

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

在这种情况下,堆栈变量名称是成功的。您现在可以在后续使用相同类型的表达式中引用它,例如......

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

你也可以把一个块作为一个属性,如下所示:

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