Ios AFNetworking 2.0:AFHTTPRequestOperationManager异步方法调用
我正在使用AFNetworking 2.0对我的应用程序进行联网,我实现了一种检查用户登录的方法Ios AFNetworking 2.0:AFHTTPRequestOperationManager异步方法调用,ios,objective-c,afnetworking,afnetworking-2,Ios,Objective C,Afnetworking,Afnetworking 2,我正在使用AFNetworking 2.0对我的应用程序进行联网,我实现了一种检查用户登录的方法 -(NSString *) loginWith : (NSString *) email andPassword :(NSString *) password { __block NSString * result ; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
-(NSString *) loginWith : (NSString *) email andPassword :(NSString *) password
{
__block NSString * result ;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"email": email, @"password": password};
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:[kROOT_URL stringByAppendingString:@"auth/"] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", (NSDictionary*)responseObject);
[[NSUserDefaults standardUserDefaults] setObject:responseObject forKey:USER_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
result = [responseObject objectForKey:@"id"];
NSLog(@"result :: %@",result);
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
result = nil;
}];
return result;
}
从另一个视图控制器调用此方法:
NSString * result = [self.user loginWith:emailCell.textField.text andPassword:passCell.textField.text];
NSLog(@"Result: %@",result);
问题是我将“null”作为result的对象,这是因为当执行NSlog时,网络进程正在后台线程中执行,所以我如何更正实现,这样我就可以在获取后的正确时刻获得结果
谢谢您应该在方法签名中添加一个“callback”块参数,并在请求完成时调用该块
- (void)loginWith:(NSString *)email andPassword:(NSString *)password complete:(void(^)(id result, NSError *error))block {
// ...
[manager POST:[kROOT_URL stringByAppendingString:@"auth/"] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
{
// ...
result = [responseObject objectForKey:@"id"];
if (block) block(result, nil)
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
if (block) block(nil, error)
}];
}
调用该方法时,传递回调块,从中可以读取结果值:
[self.user loginWith:emailCell.textField.text andPassword:passCell.textField.text complete:^(id result, NSError *error) {
if (error)
NSLog(@"Error: %@", error);
else
NSLog(@"Result: %@", result);
}];
您应该在方法签名中添加一个“callback”块参数,并在请求完成时调用该块
- (void)loginWith:(NSString *)email andPassword:(NSString *)password complete:(void(^)(id result, NSError *error))block {
// ...
[manager POST:[kROOT_URL stringByAppendingString:@"auth/"] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
{
// ...
result = [responseObject objectForKey:@"id"];
if (block) block(result, nil)
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
if (block) block(nil, error)
}];
}
调用该方法时,传递回调块,从中可以读取结果值:
[self.user loginWith:emailCell.textField.text andPassword:passCell.textField.text complete:^(id result, NSError *error) {
if (error)
NSLog(@"Error: %@", error);
else
NSLog(@"Result: %@", result);
}];
谢谢你的帮助,这真的很有效,但我只想知道这是一个很好的练习,因为我真的很在乎。谢谢你的帮助,这真的很有效,但我只想知道这是一个很好的练习,因为我真的很在乎。