AFnetworking waitUntilFinish不起作用

我正在做一个使用AFNetworking库的项目。 我用它来检查Web服务的login名和密码。 如果可以的话,这给了我200个代码。 如果它是200,我将布尔值设置为true,以便应用程序可以继续。 但是这个布尔值没有在正确的时间设置。 在login button之前,我总是需要按两次。 这是我的代码来设置布尔值。

  - (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 <AFMultipartFormData>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这是我2次按下loginbutton后的日志打印

 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 

如果你这样做

 return _loginstatus; 

你不等待操作完成,所以你不会返回你的服务器发送到你的应用程序。 我通常在这种情况下做的是在login操作被触发时显示一个UIActivityIndicator ,直到服务器响应为止。 然后,我将适当的值设置为任何variables,在这种情况下,我会继续到主屏幕。

请记住,当你使用AFNetworking你总是在做asynchronous的东西。

编辑

代码示例:

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