Ios AFNetworking 2.0-如何在子类AFHTTPSessionManager成功时将响应传递给另一个类

Ios AFNetworking 2.0-如何在子类AFHTTPSessionManager成功时将响应传递给另一个类,ios,afnetworking-2,Ios,Afnetworking 2,初学者ios AFNetworking 2.0 Qns:将AFHTTPSessionManager子类化为“MyAPIManager”并将我所有的API调用(GET/POST/PUT等)放在这个自定义管理器类中,我在另一个类(比如B类)中使用请求成功响应时遇到了问题 我知道我可以重构它并将调用后的部分提取到类B,这样我就可以在回调中转储相关的类B方法,但是这会变得很混乱,特别是在多个API调用的情况下 我想把这个响应(例如,返回的objectId)传递给另一个类,现在我只是使用一个NSNotif

初学者ios AFNetworking 2.0 Qns:将AFHTTPSessionManager子类化为“MyAPIManager”并将我所有的API调用(GET/POST/PUT等)放在这个自定义管理器类中,我在另一个类(比如B类)中使用请求成功响应时遇到了问题

我知道我可以重构它并将调用后的部分提取到类B,这样我就可以在回调中转储相关的类B方法,但是这会变得很混乱,特别是在多个API调用的情况下

我想把这个响应(例如,返回的objectId)传递给另一个类,现在我只是使用一个NSNotification,它是B类侦听的,但这仍然感觉有点“黑客”,我想知道是否有更好的方法来实现这一点

当前在MyAPIManager:AFHTTPSessionManager中:

- (void) POSTRecordJson:(NSDictionary *)json
{
[self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Posted JSON: %@", json.description);
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
        NSLog(@"Response: %@", responseObject);
        //Notify objectId received
        [[NSNotificationCenter defaultCenter]
         postNotificationName:@"ReceivedObjectIdNotification"
         object:self
         userInfo:responseObject];
    }
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];
}
在B班我打过电话:

MyApiManager *manager = [MyApiManager sharedInstance];
[manager POSTRecordJson:someJSONdict];

你可以做两件事。。通过使用协议/委托或块

但我个人更喜欢block-soo

首先创建一个块数据类型

typedef void(^SuccessBlock)(id成功)示例

并添加带有块的参数

- (void) POSTRecordJson:(NSDictionary *)json success:(SuccessBlock)success
{
[self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Posted JSON: %@", json.description);
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
        NSLog(@"Response: %@", responseObject);
        //Notify objectId received
        success(responseObject);

    }
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];
}
并调用新函数

MyApiManager *manager = [MyApiManager sharedInstance];
[manager POSTRecordJson:someJSONdict success:^(id result){
    NSDictionary *dictionary = (NSDictionary *)result;
    NSLog(@"response: %@",dictionary)
}];

你可以做两件事。。通过使用协议/委托或块

但我个人更喜欢block-soo

首先创建一个块数据类型

typedef void(^SuccessBlock)(id成功)示例

并添加带有块的参数

- (void) POSTRecordJson:(NSDictionary *)json success:(SuccessBlock)success
{
[self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Posted JSON: %@", json.description);
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
        NSLog(@"Response: %@", responseObject);
        //Notify objectId received
        success(responseObject);

    }
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];
}
并调用新函数

MyApiManager *manager = [MyApiManager sharedInstance];
[manager POSTRecordJson:someJSONdict success:^(id result){
    NSDictionary *dictionary = (NSDictionary *)result;
    NSLog(@"response: %@",dictionary)
}];

您需要将完成块传递到
-POSTRecordJson:
方法中

例如,您可以重构方法以执行以下操作:

- (void) POSTRecordJson:(NSDictionary *)json completion:(void(^)(BOOL success, id response, NSError *error))completion
{
    [self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {

        NSLog(@"Posted JSON: %@", json.description);
        if ([responseObject isKindOfClass:[NSDictionary class]])
        {
            NSLog(@"Response: %@", responseObject);

            if (completion) //if completion is NULL, calling it will crash your app so we always check that it is present.
            {
                completion(YES, responseObject, nil);
            }
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        NSLog(@"Error: %@", error);

        if (completion)
        {
            completion(NO, nil, error);
        }

    }];
}
然后,您可以这样处理此实现:

//assuming `manager` and `dictionary` exist.

[manager POSTRecordJson:dictionary completion^(BOOL success, id response, NSError *error) {

    if (success)
    {
        //do something with `response`
    }
    else
    {
        //do something with `error`
    }

}];

但是,如果您是AFNetworking的初学者,并且希望采用一种很好的结构来处理web服务,那么您应该查看您希望将完成块传递到
-POSTRecordJson:
方法中

例如,您可以重构方法以执行以下操作:

- (void) POSTRecordJson:(NSDictionary *)json completion:(void(^)(BOOL success, id response, NSError *error))completion
{
    [self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {

        NSLog(@"Posted JSON: %@", json.description);
        if ([responseObject isKindOfClass:[NSDictionary class]])
        {
            NSLog(@"Response: %@", responseObject);

            if (completion) //if completion is NULL, calling it will crash your app so we always check that it is present.
            {
                completion(YES, responseObject, nil);
            }
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        NSLog(@"Error: %@", error);

        if (completion)
        {
            completion(NO, nil, error);
        }

    }];
}
然后,您可以这样处理此实现:

//assuming `manager` and `dictionary` exist.

[manager POSTRecordJson:dictionary completion^(BOOL success, id response, NSError *error) {

    if (success)
    {
        //do something with `response`
    }
    else
    {
        //do something with `error`
    }

}];

但是,如果您是AFNetworking的初学者,并且希望采用一种很好的结构来处理web服务,则应查看

您可以在从服务器收到响应后使用块将响应发送回类:

- (void) POSTRecordJson:(NSDictionary *)json response:(void (^)(id response, NSError *error))responseBlock
    {
    [self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Posted JSON: %@", json.description);
        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            NSLog(@"Response: %@", responseObject);
           responseBlock(responseObject, nil);
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
         responseBlock(nil, error);
    }];
    }

从服务器收到响应后,可以使用块将响应发送回类:

- (void) POSTRecordJson:(NSDictionary *)json response:(void (^)(id response, NSError *error))responseBlock
    {
    [self POST:@"classes/Record/" parameters:json success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Posted JSON: %@", json.description);
        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            NSLog(@"Response: %@", responseObject);
           responseBlock(responseObject, nil);
        }
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
         responseBlock(nil, error);
    }];
    }

很好,谢谢你处理这个错误案例!如果可以的话,我会接受更多的ans…很好,谢谢你处理这个错误案例!如果我能接受更多的ans。。。