2014-01-26 57 views
1

我正在使用Parse和Facebook登錄。我的應用程序中的第一個屏幕是具有自定義Facebook登錄按鈕的登錄屏幕。基本上PFUser currentUser不能正確保存/檢索自定義屬性

[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,因爲我想知道,如果用戶明確提供的用戶名,而不是自動解析之一:當點擊該按鈕,它執行此分配。這樣,應用程序打開的文本時間,根視圖控制器(標籤欄控制器)將檢查用戶是否已有用戶名,如果不是,則將「註冊」屏幕顯示爲模式。這就是標籤欄控制器的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

這裏有什麼問題?我查看Parse中的數據瀏覽器,並且usernameIsSet列包含true和用戶分配的用戶名。

+0

你怎麼知道你殺了應用程序之前保存最終完成? – Wain

+0

當應用程序啓動時,[[PFUser currentUser]]是否返回一個值?此時實際上是否有登錄用戶? –

回答

1

的答案似乎是:

saveEventually不會在這個時候通過任何高速緩存寫入, 包括currentUser,如果應用程序已重新啓動。您需要 定期致電fetch以使其保持最新狀態。

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

+0

如何在這裏獲取幫助?如果數據沒有通過緩存寫入,並且您終止了該應用程序,那麼數據就不存在了?我面臨着這個確切的問題,不知道如何保持currentUser其他字段有效:( – theLastNightTrain

相關問題