2015-06-22 17 views
0

這是一個與如何在Swift中使用異步函數中的回調有關的問題。我無法理解回調如何完全工作。如何在Swift中實現此異步解析登錄作爲CallBack函數

當按下按鈕時,我想調用logIn(),然後保持UI活動(即在logInWithUsernameInBackground正在等待響應時不阻塞主線程)。

我的問題是我怎麼能把這個功能放在另一個類(即不是在我的viewcontroller),然後得到一個Bool無論登錄成功與否?

**我只是想知道如何分割這個函數,當調用部分在我的ViewController中,但我可以有另一個onLoginComplete,我可以放在其他類中。

func logIn() { 

     PFUser.logInWithUsernameInBackground(tv_username.text, password:tv_password.text) { 
      (user, error) -> Void in 

      if error == nil { 
       if user != nil { 
        // Yes, User Exists 

        self.goToMainMenu() 

       } else { 
        // No, User Doesn't Exist 
        println("logIn() - User Doesn't Exist") 
       } 
      } else { 
       //if error show popup      
       self.showUIAlertPopup("Oops, something went wrong", msg: "Either user exists or you are not connected", btn_text: "Try again") 
      } 

     } 
    } 

我實際上試圖做的是將異步網絡調用放在一個完全不同的類。所以我的問題是 - 如果網絡操作是在不同於ViewController的類中完成的,一旦網絡操作完成後,如何更新ViewController?

回答

0

你可以使用像我這樣做的完成處理程序。

class func getGroupFromNameWithBlock(name: String, completion: (result: Bool) -> Void){ 
    self.query().whereKey("name", equalTo: name).getFirstObjectInBackgroundWithBlock { (object, error) -> Void in 
     if error == nil { 
      completion(result: true) 
     } else { 
      completion(result: false) 
     } 
    } 
} 
+0

我實際上試圖做的是將異步網絡調用放在一個完全不同的類。所以我的問題是 - 如果網絡操作是在不同於ViewController的類中完成的,一旦網絡操作完成後,如何更新ViewController?對不起,如果不清楚,我會將此添加到問題中。 – user1406716

+0

這就是我所做的,這是一個類功能,所以你可以把它放在任何地方。 –

+0

如果您不想完成處理程序,則可以使用在用戶登錄時可以調用的委託方法。或發佈NSNotification,但委託更加乾淨。但與根據完成處理程序布爾結果更新viewController並沒有多大區別。 –