2014-12-03 133 views
2

我正在嘗試使用用Swift編寫的Parse。我能登錄,沒有任何麻煩,但我有告訴我的應用程序,用戶登錄掙扎。在Swift中從Block返回布爾值

我使用logInWithUsernameInBackground,我只是想,如果在日誌中成功返回一個布爾值。

當我使用:

func authenticateUser() -> Bool{ 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     return error === nil 
    }) 
} 

我得到的錯誤「布爾不可自由兌換作廢」,這是有道理的。

所以,如果我改變線3閱讀:

(user,error) -> Bool in 

我結束了錯誤「在呼籲參數選擇缺少參數」

然而,這種方法不需要選擇參數。

那麼我哪裏錯了?如何根據登錄時是否有錯誤返回一個布爾值?

+0

在一個側面說明,此代碼工作完全正常: VAR錯誤:NSError? PFUser.logInWithUsername(userName.text,密碼:passwordField.text,錯誤:錯誤) 如果(錯誤==無){ 還真 }其他{ 返回假 } 不過控制檯有這樣的警告: 警告:正在主線程上執行長時間運行的操作。 – ArchonLight 2014-12-03 05:51:03

+1

你必須明白logInWithUsernameInBackground是一個* asynchronous *方法,並且你的authenticateUser方法在調用完成閉包之前返回*。 – 2014-12-03 06:15:13

回答

5

基於代碼爲你寫的,如果你想返回布爾,你可以這樣做:

func authenticateUser() -> Bool{ 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     return error === nil 
    }) 

    return true // This is where the bool is returned 
} 

但是,你想要做的,根據你的代碼是什麼,就是:

func authenticateUser(completion:(Bool) ->()) { 
    PFUser.logInWithUsernameInBackground(userName.text, password: passwordField.text, block: { 
     (user,error) in 
     completion(error === nil) 
    }) 
} 

您可以通過下面的一個調用電話:

authenticateUser(){ 
    result in 
    if result { 
     println("Authenticated") 
    } else { 
     println("Not authenticated") 
    } 
} 

authenticateUser({ 
    result in 
    if result { 
     println("Authenticated") 
    } else { 
     println("Not authenticated") 
    } 
}) 

第一個是速記,在關閉之前有其他參數時更方便。

這意味着您正在取回您的布爾是否異步驗證身份。

順便說一句,你真的只需要做error == nil

+0

這正是我想要的。有一件事,我怎麼稱呼它?我通過了哪個參數? ... 如果self.authenticateUser(){//用於參數的#1,電話... 還缺少參數: 我知道這是哪裏回報會去,但將永遠是真的,是不是我希望非常感謝您使用更新後的代碼對其進行更正... ===是爲了使錯誤消失 – ArchonLight 2014-12-04 03:17:14

+0

我剛剛更新了答案,讓代碼調用它。 – 2014-12-04 09:22:10

+0

非常感謝! – ArchonLight 2014-12-04 14:08:59