【问题标题】:PFUser currentUser doesn't save/retrieve custom attribute correctlyPFUser currentUser 未正确保存/检索自定义属性
【发布时间】:2014-01-26 08:22:10
【问题描述】:

我正在使用 Parse 和 Facebook 登录。我的应用程序的第一个屏幕是带有自定义 Facebook 登录按钮的登录屏幕。单击按钮时,它会执行以下操作:

[PFFacebookUtils logInWithPermissions:@[@"email"] block:^(PFUser *user, NSError *error) {
    if (!user) {
        [[[UIAlertView alloc] initWithTitle:@"Login error" message:error.description delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        return;
    }

    if (user.isNew) {
        user[@"usernameIsSet"] = @NO;
        [user saveEventually:nil];
    }

    if ([user[@"usernameIsSet"] boolValue] == NO) {
        [self performSegueWithIdentifier:@"pushRegister" sender:self];
    } else {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}];

基本上,我将一个名为usernameIsSet 的属性附加到PFUser,因为我想知道用户是否明确提供了用户名,而不是 Parse 自动分配的用户名。这样,应用程序打开的文本时间,根视图控制器(标签栏控制器)检查用户是否已经有用户名,如果没有,则将注册屏幕显示为模式。这是标签栏控制器的viewDidAppear

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    PFUser *currentUser = [PFUser currentUser];
    if (currentUser) {
        BOOL usernameIsSet = [currentUser[@"usernameIsSet"] boolValue];
        if (!usernameIsSet) {
            RegisterViewController *registerScreen = [[UIStoryboard storyboardWithName:@"iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"RegisterViewController"];
            UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:registerScreen];
            [self presentViewController:navController animated:YES completion:nil];
        } else {

        }
    } else {
        [self performSegueWithIdentifier:@"presentLogin" sender:self];
    }
}

当出现注册屏幕并且用户输入用户名并单击完成按钮时,会触发以下方法:

- (IBAction)doneButtonClicked:(id)sender {
    PFUser *user = [PFUser currentUser];
    user[@"username"] = self.textField.text;
    user[@"usernameIsSet"] = @YES;
    [user saveEventually:nil];

    [self dismissViewControllerAnimated:YES completion:nil];
}

我不明白的是:

第一次安装和运行应用程序时,我上面的所有代码都按预期工作。显示登录,授予 Facebook 权限,然后出现注册屏幕,要求用户分配用户名。用户名被赋值,user[@"usernameIsSet"]设置为@YES,modal被dismiss,标签栏控制器的viewDidAppear被调用,currentUser[@"usernameIsSet"]依然是YES

但是,当我从 Xcode 终止运行并再次运行时,标签栏控制器的 viewDidAppear 被执行,currentUser[@"usernameIsSet"] 已经是 NO

这里有什么问题?我查看 Parse 中的数据浏览器,usernameIsSet 列包含 true,以及用户分配的用户名。

【问题讨论】:

  • 在您终止应用之前,您如何知道保存最终已完成?
  • [PFUser currentUser] 在应用启动时是否返回值?此时实际上是否有登录用户?

标签: ios iphone objective-c parse-platform facebook-login


【解决方案1】:

答案似乎是:

saveEventually此时不写入任何缓存, 包括currentUser,如果应用程序已重新启动。你需要 定期致电fetch 以保持最新状态。

发件人:https://parse.com/questions/when-you-modify-a-pfuser-does-it-write-through-the-authenticated-user-cache

【讨论】:

  • Fetch 在这方面有何帮助?如果数据还没有通过缓存写入,你杀了应用程序,数据就消失了吗?我正面临这个确切的问题,不知道如何保持 currentUser 附加字段有效:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多