AFnetworking waitUntilFinish не работает

Я делаю проект, который использует библиотеку AFNetworking. Я использую его для проверки входа и пароля с помощью webservice. Это дает мне 200-код обратно, если все в порядке. Если это 200, я устанавливаю значение boolean в true, чтобы приложение могло продолжить. Но это логическое значение не задано в нужное время. Мне всегда нужно нажать два раза на мою кнопку login , прежде чем она будет работать. Вот мой код, чтобы установить логическое значение.

    - (BOOL)credentialsValidated {
    self.progressHUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    self.progressHUD.labelText = @"Loading";
    self.progressHUD.mode = MBProgressHUDModeIndeterminate;
    self.progressHUD.dimBackground = YES;
     [[API sharedInstance] loginCommand:[NSMutableDictionary dictionaryWithObjectsAndKeys:_txtLogin.text,@"email",_txtPass.text,@"pwd", nil] onCompletion:^(NSDictionary *json){
     //completion
         if(![json objectForKey:@"error"]){
             NSLog(@"status %@",[json valueForKeyPath:@"data.status"]);
             if([[json valueForKeyPath:@"data.status"]intValue] == 200){
                //Create user object


                _loginstatus =  YES;
                [self.progressHUD hide:YES afterDelay:5];
             }else{
                 //show validation
                 _txtLogin.text = @"";
                 _txtPass.text = @"";
                 _loginstatus = NO;
             }
         }else {
             NSLog(@"Cannot connect to the server");
         }
     }];
     if(_loginstatus){
         NSLog(@"true");
    }else{
        NSLog(@"false");
    }
    [self.progressHUD hide:YES afterDelay:5];
     return _loginstatus;
}

И вот мой код API.

-(void)loginCommand:(NSMutableDictionary *)params onCompletion:(JSONResponseBlock)completionBlock{
    NSLog(@"%@%@",kAPIHost,kAPILogin);
    NSMutableURLRequest *apiRequest = [self multipartFormRequestWithMethod:@"POST" path:kAPILogin parameters:params constructingBodyWithBlock:^(id formData){
        //TODO: attach file if needed

    }];
    AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:apiRequest];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
        //success !
        NSLog(@"SUCCESSSS!");
        completionBlock(responseObject);
    }failure:^(AFHTTPRequestOperation *operation, NSError *error){
        //Failure
        NSLog(@"FAILUREE!");
        completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
    }];
    [operation start];

}

Когда я ставлю ниже [operation start] код [operation waitUntilFinish] , приложение выйдет из строя.

Может ли кто-нибудь помочь мне с этим?

С уважением

LOG Here is a print of my log after I 2 two times pressed the login button

2012-12-28 09:36:00.547 Offitel[6532:907] http://virtuele-receptie.******.sanmax.be/nl/webservice/company-user/****/*****/**************
2012-12-28 09:36:00.561 Offitel[6532:907] false
2012-12-28 09:36:01.604 Offitel[6532:907] SUCCESSSS!
2012-12-28 09:36:01.605 Offitel[6532:907] status 200
2012-12-28 09:36:20.742 Offitel[6532:907] aanmelden pressed
2012-12-28 09:36:20.746 Offitel[6532:907] http://virtuele-receptie.******.sanmax.be/nl/webservice/company-user/****/*****/**************
2012-12-28 09:36:20.748 Offitel[6532:907] true
2012-12-28 09:36:22.184 Offitel[6532:907] SUCCESSSS!
2012-12-28 09:36:22.184 Offitel[6532:907] status 200
1
nl ja de

1 ответы

Если вы сделаете это

return _loginstatus;

Вы не дожидаетесь завершения операции, поэтому вы не возвращаете то, что ваш сервер отправляет в ваше приложение. В этом случае я обычно делаю вывод UIActivityIndicator , когда действие входа завершено, и ничего до тех пор, пока сервер не ответит. Затем я устанавливаю правильные значения для любых переменных, и в этом случае я перейду на главный экран.

Помните, что когда вы используете AFNetworking , вы всегда делаете асинхронные вещи.

<Сильный> ИЗМЕНИТЬ

Пример кода:

- (void)loginActionWithPassword:(NSString *)pass
{
   //Add progress HUD to show feedback
   //I'm using MBProgressHUD library: https://github.com/jdg/MBProgressHUD#readme
    self.progressHUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    self.progressHUD.labelText = @"Loading";
    self.progressHUD.mode = MBProgressHUDModeIndeterminate;
    self.progressHUD.dimBackground = YES;

   //Launch the action to the server
    [Actions loginWithEmail:[self.textEmail.text lowercaseString] andPassword:pass success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        if ([Actions requestFailed:JSON]) {
            LOG(@"ERROR %@/%@/%@ \n", pass, request, response, JSON);
            if ([JSON[@"MSG"] isEqualToString:@"USER_NOT_REGISTERED"]) {
                self.progressHUD.labelText = @"User doesn't exist";
                self.textEmail.text = @"";
                self.textPassword.text = @"";
            } else if ([JSON[@"MSG"] isEqualToString:@"PASSWORD_INCORRECT"]) {
                self.progressHUD.labelText = @"Wrong password";
                self.textPassword.text = @"";
            }
            [self.progressHUD hide:YES afterDelay:[Utils hudDuration]];
            return;
        }
       //If everything went OK, go to this function to save user data
       //and perform segue to home screen (or dismiss modal login view)
        [self onLoginSuccessWithPassword:pass JSON:JSON response:response];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
       //If something fails, display an error message
        LOG(@"ERROR:(%@): %@/%@/%@/%@ \n", pass, request, response, error, JSON);
        self.progressHUD.labelText = @"Something went wrong, try again";
        [self.progressHUD hide:YES afterDelay:[Utils hudDuration]];
        return;
    }];
}
2
добавлено
Oké спасибо. Но можете ли вы привести пример кода?
добавлено автор Steaphann, источник
Oké спасибо, но вы можете объяснить, откуда [Utils hudDuration?
добавлено автор Steaphann, источник
Я редактировал свой код с реализацией HUD. Но все же мне нужно нажать два раза кнопку входа в систему, прежде чем она начнет работать.
добавлено автор Steaphann, источник
Я также добавил журнал в консоли.
добавлено автор Steaphann, источник
добавлено автор Steaphann, источник
Я добавил несколько примеров кода.
добавлено автор amb, источник
Да, это всего лишь запись plist, которая возвращает продолжительность в секундах.
добавлено автор amb, источник
Stef, мне кажется, что вам не хватает асинхронного подхода AFNetworking . Попробуйте поставить точку останова в обратном вызове успеха вашей функции входа в систему, а затем нажмите кнопку входа в систему. Если выполнение не останавливается в точке останова, у вас есть другая проблема в другом месте.
добавлено автор amb, источник
@StefGeelen вы все равно возвращаете переменную в конце вашей функции, и это не сработает. Вы читали мой код? AFNetworking - это асинхронная библиотека, вы должны делать свой материал (сохранение информации, выполнение segues) внутри вашего обратного вызова.
добавлено автор amb, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.

ntwrk
ntwrk
1 773 участник(ов)

Группа для сетевых инженеров Создатель группы: @HelloSadness Админы: @darwinggl @mxssl @Sk1f3r @blademd @gngbng

RU.SYSADMIN — Олды здесь?
RU.SYSADMIN — Олды здесь?
1 616 участник(ов)

Ламповая конференция сисадминов! Правила: http://telegra.ph/Pravila-ru-sysadmin-12-01 Список интересных групп и каналов: https://github.com/goq/telegram-list

Pro Telecom
Pro Telecom
884 участник(ов)

Добро пожаловать, связисты! Запрещена реклама чатов Cообщество для своих - https://www.facebook.com/groups/protelecom/ https://vk.com/telecomrf

pro.enterprise
pro.enterprise
346 участник(ов)

Темы обсуждения: Сервера, системы хранения данных, hardware, software, сети хранения данных, сетевое оборудование, облачные инфраструктуры и никакой политики.