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