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; }]; }
- kCFStreamErrorDomainSSL,当通过iOS 9中的HTTPS通过IP地址连接到服务器时为-9802
- UICollectionView – 下载图像并有效地重新加载数据,比如Instagram
- 使用networking传递在GET方法中传递参数
- AFNetworking 2.0:无法使用JSON从IOS进行POST
- 与AFNetworking在UICollectionView错误asynchronous下载
- AFNetworking和networking错误
- AFNetworking将JSON数组作为多个单项词典发布
- AFNetworking 2.0在代码块400中从代码400获取JSON
- APPLE MACH-O LINKED ERROR添加AFNetworking后