3

我有一个方法调用(它是来自 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"]);  
}

失败块也是如此。

因此,我希望AFJSONRequestOperation像这样拨打电话:

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

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

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

谢谢!

4

1 回答 1

6

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

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

您还可以将块设置为属性,如下所示:

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

并这样称呼它:

self.success(aRequest, aResponse, someJSON);

记住在调用完它时将其设为 nil,这样调用者就不必担心创建保留周期了。

编辑:关于使用 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;
于 2013-08-13T23:06:04.497 回答