Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 延迟显示LoginViewController_Ios_Objective C_Ios7 - Fatal编程技术网

Ios 延迟显示LoginViewController

Ios 延迟显示LoginViewController,ios,objective-c,ios7,Ios,Objective C,Ios7,我有一个应用程序,它使用的accessToken只能保留两个小时。我的应用程序有三个UINavigationController,其中UITableViewController位于uitabarcontroller中。每次单击其中一个选项卡时,都会创建一个新连接,并检查HTTP响应的状态码是200还是401。如果状态码为401,是因为我的accessToken不再有效,我必须重新登录 我的问题是,当当前viewController调用LoginViewController时,因为401,Logi

我有一个应用程序,它使用的accessToken只能保留两个小时。我的应用程序有三个UINavigationController,其中UITableViewController位于uitabarcontroller中。每次单击其中一个选项卡时,都会创建一个新连接,并检查HTTP响应的状态码是200还是401。如果状态码为401,是因为我的accessToken不再有效,我必须重新登录

我的问题是,当当前viewController调用LoginViewController时,因为401,LoginViewController会延迟显示,您可以看到UITableViewController的单元格

我的代码是:

- (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我同意你说的。我要试试这个。谢谢!!