我正在使用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
,模式已解除,标签栏控制器的viewDidAppear
已被调用,currentUser[@"usernameIsSet"]
仍为YES
。
但是,当我从Xcode终止运行并再次运行时,标签栏控制器的viewDidAppear
将被执行,currentUser[@"usernameIsSet"]
已经NO
。< / p>
这里有什么问题?我在Parse中查看数据浏览器,usernameIsSet
列包含true,以及用户指定的用户名。
答案 0 :(得分:1)
答案似乎是:
saveEventually
目前没有通过任何缓存写入, 如果应用已重新启动,则包括currentUser
。你需要 定期致电fetch
以使其保持最新状态。