0

几个小时以来,我一直在脑海中喋喋不休。我正在尝试UserProfileViewController在我的应用程序上创建一个可以处理喜欢、书签等的程序。它将接收来自子控制器的 access_token:LoginViewController

我有LoginViewController工作。它将 UIWebView 启动到远程系统。远程系统处理登录并接收作为用户 ID 的 access_token。

我已经在我的文件中设置了一个委托LoginViewController来传回数据,但我想我想要UserProfileViewController.

这是我想象的 UserProfileViewController.m 的样子,但显然它不起作用:

@synthesize access_token = _access_token;

- (NSString *) access_token  // Getter
{
    if(!_access_token)
    {
        _access_token= [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"];
        if (!_access_token)
        {
            LoginViewController *loginViewController = [[LoginViewController alloc] init];
            loginViewController.delegate = self;

            [self.navigationController pushViewController:loginViewController animated:YES];
            // I need the access_token here but it won't arrive until delegate_AccessToken is called by LoginViewController
        }
    }
    return _access_token;
}

// received from LoginViewController
- (void) delegate_AccessToken: (NSString *) aAccess_token
{
    // now it's too late to use this in the Getter
}


- (IBOutlet *) likes: (id) sender
{
    [self likeThis: sender access_token: _access_token];
}

什么时候打电话LoginViewController来获取 access_token 的好时机?

4

2 回答 2

0

一个很好的模式是尽快UserProfileViewController调用,LoginViewController例如viewDidLoadUserProfileViewController请在获取访问令牌时加载

于 2012-06-16T19:06:58.923 回答
0

因此,如果我正确理解了您的流程,那么如果用户未登录(换句话说,除非您已登录,否则您没有个人资料),让用户进入 UserProfileViewController 是没有意义的。所以我要做的是:

  • 强制用户首先从您的 ParentViewController 推送 LoginViewController 登录。将其存储在 LoginViewController 类中的 NSUSerDefaults 中,然后推送您的 UserProfileViewController。

  • 如果由于某种原因发生超时,并且您的 access_token 不再有效,您应该使用 NSNotifications 执行注销操作(从您在应用程序中的任何 ViewController 再次推送 LogInViewController)。

发生超时时发布通知:

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter postNotificationName:@"performLogOut"
                                  object:nil
                                userInfo:nil];

使依赖于该令牌的每个 ViewController 成为侦听器:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(performLogOut)
                                             name:@"logOut"
                                           object:nil];

最后,在所有正在侦听的 ViewController 中实现 performLogOut,并将 LogInViewController 推入其中以强制用户登录。

希望这可以帮助!

于 2013-03-18T18:39:09.207 回答