我现在已经在我脑子里晃了几个小时。我正在尝试创建一个UserProfileViewController
来处理我的应用上的赞,书签等。它将从子控制器接收access_token:LoginViewController
我LoginViewController
正在工作。它将UIWebView启动到远程系统。远程系统处理登录并接收access_token,即用户的ID。
我已在我的LoginViewController
中设置了一个委托来传回数据,但我想我想要UserProfileViewController
中的Getter中的值。
以下是我想象的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的好时机?
答案 0 :(得分:0)
一个好的模式是UserProfileViewController
尽快调用LoginViewController
,例如在viewDidLoad
中,并且代表没有返回信息您将不会在UserProfileViewController
中显示任何数据,您可能会提示加载hud,告诉用户在获取访问令牌时请加载
答案 1 :(得分: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以强制用户登录。
希望这有帮助!