2016-04-23 4 views
0

APIRequest.mLoginController.mという2つのファイルがあります。nsuserdefaultsから値を格納して取得する際に衝突が発生する

APIRequest.mファイルには、次のコードを含むreceiveLoginDataメソッドがあります。サーバーからステータスコードを受信します。資格情報がすべて正しい場合、ステータスコードは1になります。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); 

} 

、彼らは同じクラスになっていないか、直接通信できない場合は、使用通知センター。 、>

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

そして最後に - >

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

と機能 -

その非常に簡単、あなたがどこかのviewDidLoadで、[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]; 
[[NSNotificationCenter defaultCenter] 
postNotificationName:@"didSuccessfullyLogin" 
object:self]; 

これが役に立ちます。

+0

を後でアクセスする方法を投稿しましたか? – user1241241

+0

デフォルトはありますが、いつでもアクセスできます。通知は保存される前にアクセスしないようにしました。 –

+0

はアクセスできませんでした。 – user1241241

関連する問題