2015-09-03 58 views
1

當用戶登錄時,我需要加載他們的信息&數據。在解析中,我使用signUpInBackgroundWithBlock方法來設置一個帳戶。我不確定我在登錄時如何檢索這些信息。我試過以下代碼沒有成功:登錄後加載帳戶信息解析

class Klikur: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var loadUser = PFQuery(className:"GameScore") 
    loadUser.getObjectInBackgroundWithId("xWMyZEGZ") {(gameScore: PFObject?, error: NSError?) -> Void in 
    if error == nil && gameScore != nil { 
     println(gameScore) 
    } else { 
     println(error) 
    } 
} 

我在做什麼錯?我以爲它會拉這個ID的行,並給我的信息,但我想這不是那樣做。

+0

所以如果我理解......你在想一旦**用戶登錄**到應用程序中,如果所有的信息和字段後/正確你應該直接去應用程序 – Lamar

+0

是的,這是正確的。 –

+0

這就是我想用來加載他們的信息,但它不工作。 –

回答

1

解析使得這極其簡單。首先讓我們回過頭來仔細討論一些主要關鍵點:

當用戶登錄時,我需要加載他們的信息&數據。在解析中,我使用signUpInBackgroundWithBlock方法來設置一個帳戶。我不確定我在登錄時如何檢索這些信息。

這是一個好的開始。你在正確的軌道上。一旦他們成功註冊,您就不需要做其他事情了。因爲你正在使用這種方法,你有對象,對象(包含他們所有的信息:用戶名,電子郵件,密碼等)。因爲您正在使用block,所以您有callback,這是您如何檢索其信息。這一切都在同一個方法中完成,不需要創建另一個實例來提供已經給出的內容。它會看起來像這樣:

user.signUpInBackgroundWithBlock { 
    (succeeded: Bool, error: NSError?) -> Void in 
    if error == nil { 
    // do something if there is an error signing up 
    } else { 
    // You have a successful log in. Which means you now have a cached user on device 
    } 
} 

那麼,一旦他們註冊後,你如何獲得任何用戶字段?通過調用緩存的用戶或currentUser。任何緩存意味着它存儲在用戶設備上,即使通過應用終止,它仍然存在。在這種情況下,只要會話成功啓動,就會對其進行緩存。它不會持續通過應用程序刪除和重新安裝,但它會緩存在您的設備上,因此您可以在任何情況下調用它。所以在你的signUpInBackgroundBlock回調或真的任何地方註冊後在不同的視圖控制器中,爲了看到登錄的用戶信息,你只需要調用currentUser,這樣你就可以檢索到它的所有參數。事情是這樣的:

if error = nil { 

} else { 
    var currentUser = PFUser.currentUser() //This gets the current user where you can get information like 
    var userObjectId = currentUser.objectId //returns the current users objectId 
    var userUsername = currentUser.username //returns username  
} 

如果你想從你的User類獲得自定義字段,那麼你將必須執行一個查詢,你還不如不甚至與緩存版本打擾,因爲你已經累死API請求來檢索自定義字段值。假設您在User類中創建了一個列類型字符串,用於存儲用戶電話號碼。然後,您將不得不創建一個查詢來檢索該信息。否則,您始終可以使用簡化的緩存信息將其顯示在任何視圖控制器中。

簡單的用戶查詢將是這個樣子:

var query = PFUser.query() //NOTICE there is no classname, this is the proper way to query the User class, no matter what you see elsewhere. 
query.whereKey("username", equalTo:PFUser.currentUser().username) 
query.getFirstObjectInBackgroundWithBlock { 
    (user : PFUser?, error: NSError?) -> Void in 
    if user == nil { 
    println("No user with that username") 
    } else { 
    //retrive your special column data 
    let userPhoneNumber = user["PhoneNumberColumnName"] as String 
    }   
} 
0

正如Milo526說,如果在創建用戶並登錄,

let user = PFUser.currentUser() 

將返回該用戶的數據。

但是,如果您的查詢是針對類用戶的,但您將className設置爲「gameScore」,則查詢將失敗查找並返回錯誤。

嘗試:

var loadUser = PFQuery(className:"User") 
loadUser.getObjectInBackgroundWithId("xWMyZEGZ") { 
} 

在保證xWMyZEGZ是在分析用戶表中有效的OBJECTID。

+0

當你想獲取用戶的信息時應該調用它。您可以在顯示此控制器之前調用它,然後在創建控制器時將該用戶傳遞給此控制器,這樣您不必等待加載後但在顯示信息之前完成後臺請求 – Lytic

+0

一個選項將存儲用戶變量在appDelegate中,然後當您的註冊通話將新用戶保存到數據庫時,也將其保存到您的應用程序委託中。在該視圖控制器的viewDidLoad中,您可以獲取保存在appDelegate中的用途,而無需再次調用。但是,PFUser.currentUser()再一次爲您處理所有這些問題。 – Lytic