我有一个方法调用(这是来自 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/