2016-04-23 179 views
0

存储和检索值我有两个文件,即APIRequest.mLoginController.m碰撞发生时,从nsuserdefaults

APIRequest.m文件有一个包含以下代码的receiveLoginData方法。状态码将从服务器接收。如果证书都是正确的,状态码将是1 else 0.我将它保存到NSUserDefaults如下。

第一块码:

- (void)receivedLoginData:(NSData *)data 
{ 
    //NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    // NSLog(@"%@",newStr); 
    NSError *localError = nil; 
    self.parsedObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&localError]; 
    NSString* loginResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 


    NSData *jsonData = [loginResponse dataUsingEncoding:NSUTF8StringEncoding]; 

    NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil]; 
    NSString *statusCode = [NSString stringWithFormat:@"%@",jsonDic[@"status"]]; 

    self.statusCode = [NSString stringWithFormat:@"%@",jsonDic[@"status"]]; 
//  NSLog(@"Setting is %@", self.statusCode); 
//  NSLog(@"%@",loginResponse); 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    [prefs setObject:statusCode forKey:@"statusCode"]; 
    [prefs synchronize]; 

} 

LoginController中得到了下面的代码。在这里我尝试通过调用[self.request loginValidation];

if (([self.request.usernameText isEqualToString:@""] && [self.request.passwordText isEqualToString:@""]) || ([self.request.usernameText isEqualToString:self.usernameTextField.text] && [self.request.passwordText isEqualToString:@""]) || ([self.request.usernameText isEqualToString:@""] && [self.request.passwordText isEqualToString:self.passwordTextField.text])) 

     { 
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"" message:@"Username or Password cant be left empty." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 
      [self performSelector:@selector(select) withObject:self.request afterDelay:.1]; 
     } else{ 
      [self.request loginValidation]; 
      NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
      NSString* strValue = [defaults objectForKey:@"statusCode"]; 
      NSLog(@"code %@",strValue); 

     } 

第一次检索的NSUserDefaults的时候的StatusCode我运行应用程序,并提供正确的登录凭据,状态码被设置在APIRequest.m文件是1,因此它得到检索时,值仍然是1.

第二次我尝试给出错误的登录凭据,因此在APIRequest.m文件中设置的状态代码为0,但是当它获取时,值仍然是1.我怎样才能解决这个冲突?

+1

请勿在您的应用程序中使用NSUserDefaults进行通信。而是调用另一个类的方法或使用NSNotificationCenter。 – Paulw11

+0

你能否提供一些参考我的代码的代码? – user1241241

+1

不是真的,因为我不完全确定你所显示的代码发生了什么,我怀疑'loginValidation'是异步完成的,所以你需要完成块来发布通知,或者你可以提供一个完成块给'loginValidation '方法。 – Paulw11

回答

2

好的,这里是主要问题,[self.request loginValidation];会在后台线程中调用代码,并等待响应到来,底线会被执行,而无需等待登录验证实际完成。

一个更好的方式来做到这将是调用函数来检查登录收到数据后 - >

self.statusCode = [NSString stringWithFormat:@"%@",jsonDic[@"status"]]; 
//  NSLog(@"Setting is %@", self.statusCode); 
//  NSLog(@"%@",loginResponse); 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

[prefs setObject:statusCode forKey:@"statusCode"]; 
[prefs synchronize]; 
[self confirmValidation]; 


-(void) confirmValidation 
{ 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    NSString* strValue = [defaults objectForKey:@"statusCode"]; 
    NSLog(@"code %@",strValue); 

} 

现在,如果他们不是在同一个类或不能直接通信,使用通知中心。

它很简单,在你调用[self.request loginValidation];,在viewDidLoad中或其他地方的控制器添加一个观察者 - >

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didSuccessfullyLogin:) 
              name:@"didSuccessfullyLogin" 
              object:nil]; 

和一个功能 - >

- (void) didSuccessfullyLogin:(NSNotification *) notification 
{ 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    NSString* strValue = [defaults objectForKey:@"statusCode"]; 
    NSLog(@"code %@",strValue); 
} 

最后,

self.statusCode = [NSString stringWithFormat:@"%@",jsonDic[@"status"]]; 
//  NSLog(@"Setting is %@", self.statusCode); 
//  NSLog(@"%@",loginResponse); 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

[prefs setObject:statusCode forKey:@"statusCode"]; 
[prefs synchronize]; 
[[NSNotificationCenter defaultCenter] 
postNotificationName:@"didSuccessfullyLogin" 
object:self]; 

希望这会有所帮助。

+0

以后如何访问它? – user1241241

+0

它有默认值,你可以随时访问它。通知可确保您在保存之前不会访问它。 –

+0

无法访问它。 – user1241241