如何在Getter中使用委托数据?

时间:2012-06-16 18:56:27

标签: objective-c ios delegates

我现在已经在我脑子里晃了几个小时。我正在尝试创建一个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的好时机?

2 个答案:

答案 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以强制用户登录。

希望这有帮助!