AFNetworking 2.0: вызов асинхронного метода AFHTTPRequestOperationManager

Я использую 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" в качестве объекта результата. Это связано с тем, что при выполнении NSlog сетевой процесс выполнялся в фоновом потоке, поэтому, как я исправляю реализацию, чтобы потом я мог получить правильный результат момент, после извлечения

Спасибо


person iOSGeek    schedule 18.11.2013    source источник


Ответы (1)


Вы должны добавить параметр блока «обратный вызов» в сигнатуру вашего метода и вызвать этот блок, когда запрос будет выполнен.

- (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);
}];
person Arnold    schedule 18.11.2013
comment
Спасибо за помощь; это действительно работает, но я просто хочу знать, что это хорошая практика, так как я действительно забочусь об этом. - person iOSGeek; 19.11.2013