APIRequest.m
とLoginController.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です。どうすればこの衝突を解決できますか?
アプリ内の通信にNSUserDefaultsを使用しないでください。むしろ、他のクラスのメソッドを呼び出すか、NSNotificationCenterを使用してください。 – Paulw11
私のコードを参考にいくつかのコードを提供していただけますか? – user1241241
あなたが示したコードから何が起こっているのかよく分かっていないので、私は 'loginValidation'が非同期的に完了したと考えます。したがって、通知をポストするために補完ブロックが必要です。あるいは、' loginValidation 'メソッド。 – Paulw11