Ios AFNetworking 2.0:AFHTTPRequestOperationManager异步方法调用

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

我正在使用AFNetworking 2.0对我的应用程序进行联网,我实现了一种检查用户登录的方法

-(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);
}];

谢谢你的帮助,这真的很有效,但我只想知道这是一个很好的练习,因为我真的很在乎。谢谢你的帮助,这真的很有效,但我只想知道这是一个很好的练习,因为我真的很在乎。