从 nsuserdefaults 存储和检索值时发生冲突
Collision occurs while storing and retrieving values from nsuserdefaults
我有两个文件,即 APIRequest.m
和 LoginController.m
。
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];
从 NSUserDefaults 检索状态码
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);
}
第一次当我 运行 应用程序并提供正确的登录凭据时,APIRequest.m 文件中设置的状态代码为 1,因此当它被检索时,值仍然为 1。
我第二次尝试提供错误的登录凭据,因此在 APIRequest.m 文件中设置的状态代码为 0,但是当它被检索时,该值仍然是 1。我该如何解决这个冲突?
好的,这是主要问题,[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);
}
现在,如果他们不在同一个 class 或无法直接通信,请使用通知中心。
非常简单,在您调用的控制器中 [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];
希望对您有所帮助。
我有两个文件,即 APIRequest.m
和 LoginController.m
。
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);
}
第一次当我 运行 应用程序并提供正确的登录凭据时,APIRequest.m 文件中设置的状态代码为 1,因此当它被检索时,值仍然为 1。
我第二次尝试提供错误的登录凭据,因此在 APIRequest.m 文件中设置的状态代码为 0,但是当它被检索时,该值仍然是 1。我该如何解决这个冲突?
好的,这是主要问题,[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);
}
现在,如果他们不在同一个 class 或无法直接通信,请使用通知中心。
非常简单,在您调用的控制器中 [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];
希望对您有所帮助。