Ios 延迟显示LoginViewController
我有一个应用程序,它使用的accessToken只能保留两个小时。我的应用程序有三个UINavigationController,其中UITableViewController位于uitabarcontroller中。每次单击其中一个选项卡时,都会创建一个新连接,并检查HTTP响应的状态码是200还是401。如果状态码为401,是因为我的accessToken不再有效,我必须重新登录 我的问题是,当当前viewController调用LoginViewController时,因为401,LoginViewController会延迟显示,您可以看到UITableViewController的单元格 我的代码是:Ios 延迟显示LoginViewController,ios,objective-c,ios7,Ios,Objective C,Ios7,我有一个应用程序,它使用的accessToken只能保留两个小时。我的应用程序有三个UINavigationController,其中UITableViewController位于uitabarcontroller中。每次单击其中一个选项卡时,都会创建一个新连接,并检查HTTP响应的状态码是200还是401。如果状态码为401,是因为我的accessToken不再有效,我必须重新登录 我的问题是,当当前viewController调用LoginViewController时,因为401,Logi
- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:[CaseCell class] forCellReuseIdentifier:@"identifier"];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
self.accessToken = [userDefaults objectForKey:@"accessToken"];
if (self.accessToken == nil) {
LoginViewController *loginViewController = [[LoginViewController alloc] init];
[self presentViewController:loginViewController animated:NO completion:nil];
} else {
[self refresh];
}
}
- (void)refresh
{
NSURLSession *session = [NSURLSession sharedSession];
NSString *urlString = [[NSString alloc] initWithFormat:@"myURL", self.accessToken];
NSURL *url = [[NSURL alloc] initWithString:urlString];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
NSData *data = [[NSData alloc] initWithContentsOfURL:location];
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
NSInteger statusCode = [httpResponse statusCode];
if (statusCode == 200) {
NSArray *responseArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
self.cases = responseArray;
}
dispatch_async(dispatch_get_main_queue(), ^{
if (statusCode == 200) {
[self.tableView reloadData];
} else {
LoginViewController *loginViewController = [[LoginViewController alloc] init];
[self presentViewController:loginViewController animated:NO completion:nil];
}
});
}];
[task resume];
}
我真的不知道是什么问题。我的意思是,我知道这与后台发生的事情和异步调度有关,但我已经做了所有的事情,我不知道为什么会出现这种延迟
PD:不要注意默认值。我知道我必须把代币储存在钥匙链里
多谢各位 您可以使用委托方法
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
这将由UITabBarController调用,以检查会话是否仍然有效,然后继续查看控制器或启动登录控制器。如果在视图加载之前尝试将其添加到视图控制器的视图中,它将没有任何可添加的内容,并且如果在视图加载之后调用它,则在它启动登录屏幕之前,您将看到原始视图。是否尝试将If语句放置在其他视图控制器生命周期方法中?例如,我从未尝试过写这篇文章,也许您可以将if self.accessToken==nil{…loadView中的语句,即在viewDidLoad之前执行。或者,在屏幕上覆盖一个半透明的白色UIView子视图,后跟viewDidLoad中的bringSubviewToFront:方法,然后在完成LoginViewController方法后,您可以从SuperView中删除该半透明的cover子视图。仍然不工作。我将尝试b我同意你说的。我要试试这个。谢谢!!