2015-08-27 67 views
1

我試圖讓我所有的用戶會話與Parse獨佔,這意味着如果用戶已經在特定位置的某個設備上登錄,如果另一個設備使用相同的憑據登錄,我希望先前的會話(s)被終止,當然有一個警報視圖的消息。有點像舊的AOL Instant Messaging格式。我想通了這個動作的代碼應該在登錄邏輯寫,所以我寫了我的登入「繼承」的代碼中:如何正確使解析雲代碼請求?

PFUser.logInWithUsernameInBackground(userName, password: passWord) { 
     (user, error: NSError?) -> Void in 
     if user != nil || error == nil { 
      dispatch_async(dispatch_get_main_queue()) { 
       self.performSegueWithIdentifier("loginSuccess", sender: self) 

       PFCloud.callFunctionInBackground("currentUser", withParameters: ["PFUser":"currentUser"]) 
        //..... Get other currentUser session tokens and destroy them 

      } 

     } else { 

那可能不是正確的雲代碼調用,但你明白了吧。當用戶再次登錄另一臺設備時,我想抓住其他會話並終止它們。有沒有人知道正確的方式去迅速提出這個請求?

回答

2

我用口吃說話迅速,但我認爲我可以在幾乎迅速回答充分。關鍵的想法是,只有在雲表示沒問題之後才能開始成功。以下是我想要的內容:

PFUser.logInWithUsernameInBackground(userName, password: passWord) { 
    (user, error: NSError?) -> Void in 
    if (user != nil) { 
     // don't do the segue until we know it's unique login 
     // pass no params to the cloud in swift (not sure if [] is the way to say that) 
     PFCloud.callFunctionInBackground("isLoginRedundant", withParameters: []) { 
      (response: AnyObject?, error: NSError?) -> Void in 
      let dictionary = response as! [String:Bool] 
      var isRedundant : Bool 
      isRedundant = dictionary["isRedundant"]! 
      if (isRedundant) { 
       // I think you can adequately undo everything about the login by logging out 
       PFUser.logOutInBackgroundWithBlock() { (error: NSError?) -> Void in 
        // update the UI to say, login rejected because you're logged in elsewhere 
        // maybe do a segue here? 
       } 
      } else { 
       // good login and non-redundant, do the segue 
       self.performSegueWithIdentifier("loginSuccess", sender: self) 
      } 
     } 
    } else { 
     // login failed for typical reasons, update the UI 
    } 
} 

請不要太在意swift語法。這個想法是將segue嵌套在完成處理程序中,以知道在啓動它之前需要執行它。另外請注意,完成處理程序中的main_queue上的顯式放置是不必要的。 SDK在主體上運行這些塊。

一個簡單的檢查,以確定用戶的會話是多餘的(不是唯一的)看起來像這樣...

Parse.Cloud.define("isLoginRedundant", function(request, response) { 
    var sessionQuery = new Parse.Query(Parse.Session); 
    sessionQuery.equalTo("user", request.user); 
    sessionQuery.find().then(function(sessions) { 
     response.success({ isRedundant: sessions.length>1 }); 
    }, function(error) { 
     response.error(error); 
    }); 
}); 
+0

好吧,我明白了,在你的答案,唯一的地方,我應該寫我自己的自定義代碼是在logoutInBackground之後?除了這基本上是我應該正確滾動的結構? –

+0

是的。那裏,註銷完成後,在其他條件的葉級別(其中評論說「更新UI」) – danh

+0

yeag我已經有其他的錯誤設置 –