Ios AFNetworking 2.0-如何在子类AFHTTPSessionManager成功时将响应传递给另一个类
初学者ios AFNetworking 2.0 Qns:将AFHTTPSessionManager子类化为“MyAPIManager”并将我所有的API调用(GET/POST/PUT等)放在这个自定义管理器类中,我在另一个类(比如B类)中使用请求成功响应时遇到了问题 我知道我可以重构它并将调用后的部分提取到类B,这样我就可以在回调中转储相关的类B方法,但是这会变得很混乱,特别是在多个API调用的情况下 我想把这个响应(例如,返回的objectId)传递给另一个类,现在我只是使用一个NSNotification,它是B类侦听的,但这仍然感觉有点“黑客”,我想知道是否有更好的方法来实现这一点 当前在MyAPIManager: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
- (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。。。