我正在开发一款需要用户登录应用的应用。假设用户登录到我的应用程序并在服务器上维护会话。由于任何网络问题或任何其他原因,该会话将来在服务器上过期。在此之后,对于任何服务器请求,服务器将抛出错误请求。我正在捕捉这种情况,并向用户发出警报,告知他的会话已过期,他们需要重新登录。同样清除NSUserDefaults
。点击Alert OK button
后,会向用户显示signIn页面
我的问题是,这是正确的方法吗?从ViewController文档中,它声明presented ViewController
将显示在presenting ViewController
上。所以我想知道在呈现SignInViewController
之后我之前的ViewControllers发生了什么,它会泄漏任何内存还是会出现任何意外行为?澄清问题在下面添加了一个流程。我想知道在最后一步之后,ViewControllerB
SignInViewController> ViewControllerA> ViewControllerB>(会话已过期)> AlertViewController>(已呈现)SignInViewController
- (void)presentLoginScreenAfterSessionIsExpired
{
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"employeeId"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"userName"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"emailId"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"profileImageData"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"role"];
/** showing alert to the User **/
UIAlertController *alert = [UIAlertController alertControllerWithTitle:
@"Oops!" message:@"Your Session Has Been Expired, Please Re-Login"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:
NSLocalizedString(@"OK", @"OK Action")
style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
/** presenting signInViewController **/
UIViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:
@"signInViewController"];
[self presentViewController:vc animated:YES completion:NULL];
}];
[alert addAction:okAction]; // Here action is added to alert controller.
[self presentViewController:alert animated:YES completion:nil];
}
答案 0 :(得分:0)
由于您在ViewControllerB
之上呈现模态视图控制器,因此视图控制器将简单地覆盖前一个视图控制器。您当前堆栈中的所有视图控制器都将保留在内存中。您还可以使用protocol
或NSNotification
通知您之前的视图控制器有关登录操作成功或失败的信息。
SOF还有关于此主题的其他问题,可以更清楚地了解视图控制器的生命周期,例如:这个:Releasing ViewControllers form memory inside a UINavigationController