2016-09-13 4 views
1

CloudKit에서 레코드를 사용하는 인증을 만들었으므로 계정을 만든 다음 로그인 페이지로 이동하여 처음 로그인 할 때 내 오류 메시지 " 사용자 이름 또는 암호가 틀렸습니다. "그러나 두 번째로 로그인 버튼을 누르면 작동합니다. 나는 이것이 무엇을 일으키는 지 전혀 모른다.CloudKit, My Auth Not

func loginPressed() { 

    validLogin() 

    if usernameExists == true && passwordIsValid == true { 
     performSegue(withIdentifier: "loginToGames", sender: self) 
    } else { 

     self.incorrectLabel.isHidden = false 
    } 
} 



func validLogin() { 

    let container = CKContainer.default() 
    let pubDB = container.publicCloudDatabase 

    //query users to find current user 
    let query = CKQuery(recordType: "MyUsers", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(query, inZoneWith: nil, completionHandler: { (records, error) in 

     if error == nil { 

      for record in records! { 

       if record.object(forKey: "Username") as? String == self.usernameField.text { 

        self.incorrectLabel.isHidden = true 
        self.usernameExists = true 
        print("searchUsername \(record.object(forKey: "Username") as? String)") 
       } else { 

        self.incorrectLabel.isHidden = false 
        self.usernameExists = false 
        print("searchUsername error") 
       } 

      } 

     } else { 
      print("searchLoginError\(error)") 
     } 
    }) 

    let queryPassword = CKQuery(recordType: "MyUsers", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(queryPassword, inZoneWith: nil, completionHandler: { (records, error) in 

     if error == nil { 

      for record in records! { 

       if record.object(forKey: "Password") as? String == self.passwordField.text { 

        self.incorrectLabel.isHidden = true 
        self.passwordIsValid = true 
        print("searchPassword \(record.object(forKey: "Password") as? String)") 
       } else { 

        self.incorrectLabel.isHidden = false 
        self.passwordIsValid = false 
        print("searchPassword error") 
       } 

      } 

     } else { 
      print("searcherror\(error)") 
     } 
    }) 

} 

func checkValidLogin() { 

    let container = CKContainer.default() 
    let pubDB = container.publicCloudDatabase 

    //query users to find current user 
    let query = CKQuery(recordType: "MyUsers", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(query, inZoneWith: nil, completionHandler: { (records, error) in 

     //we do not need to check for error code 11 because a user should exist 
     if error == nil { 

      var userExists = false 

      for record in records! { 

       if record.object(forKey: "Username") as? String == self.usernameField.text { 

        if record.object(forKey: "Password") as? String == self.passwordField.text { 

         OperationQueue.main.addOperation { 

          userExists = true 
          UserDefaults.standard.set(self.usernameField.text!, forKey: "Username") 
          username = self.usernameField.text! 


         } 

        } else { 

         //user with the username exists, but the password does not match 
         self.incorrectLabel.isHidden = false 

        } 

       } 

      } 

      if userExists == false { 

       //user with that username does not exist 
       self.incorrectLabel.isHidden = false 

      } 


     } else { 

      print("searcherror \(error)") 

     } 

    }) 

} 

답변

2

그것은 매우 간단합니다 : 여기

내가 관련 코드를 생각하는 것입니다.

userExistspasswordIsValid을 확인하는 비동기 호출을 수행하고 있지만 if 테스트를 수행하기 전에 대답을 원하고 있지 않습니다.

처음으로 completionHandler가 완료되지 않았으므로 userExistspasswordIsValidfalse으로 설정됩니다. 두 번째 실행에서 처리기는 true 값을 설정했습니다.

당신은 validLogin 기능에 대한 completionHandler로 if 시험을 통과해야

샘플 : 당신의 완료 핸들러에 참여 아래

func loginPressed() { 

    validLogin() { (usernameExists, passwordIsValid) in 

     if usernameExists == true && passwordIsValid == true { 
      performSegue(withIdentifier: "loginToGames", sender: self) 
     } else { 
      self.incorrectLabel.isHidden = false 
     } 
    } 
} 

func validLogin(completion : ((usernameExists : Bool, passwordIsValid : Bool) -> Void)) { 

    let container = CKContainer.default() 
    let pubDB = container.publicCloudDatabase 
    let group = dispatch_group_create() //make sur both handler are triggered 
    //query users to find current user 

    dispatch_group_enter(group) 
    let query = CKQuery(recordType: "MyUsers", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(query, inZoneWith: nil, completionHandler: { (records, error) in 

     if error == nil { 

      for record in records! { 

       if record.object(forKey: "Username") as? String == self.usernameField.text { 

        self.incorrectLabel.isHidden = true 
        self.usernameExists = true 
        break 
       } else { 
        self.incorrectLabel.isHidden = false 
        self.usernameExists = false 
       } 
      } 

     } else { 
      print("searchLoginError\(error)") 
     } 

     dispatch_group_leave(group) 

    }) 

    dispatch_group_enter(group) 
    let queryPassword = CKQuery(recordType: "MyUsers", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil)) 
    pubDB.perform(queryPassword, inZoneWith: nil, completionHandler: { (records, error) in 


     if error == nil { 
      for record in records! { 
       if record.object(forKey: "Password") as? String == self.passwordField.text { 

        self.incorrectLabel.isHidden = true 
        self.passwordIsValid = true 
        break 
       } else {  
        self.incorrectLabel.isHidden = false 
        self.passwordIsValid = false 
        print("searchPassword error") 
       } 

      } 
     } else { 
     print("searcherror\(error)") 
     } 
     dispatch_group_leave(group) 

    }) 

    dispatch_group_notify(group, dispatch_get_main_queue()) { 
    //You have both answers 
     completion(self.usernameExists, passwordIsValid : self.passwordIsValid) 

    }) 
} 
+0

죄송합니다. 어디에서 추가해야합니까? 나는 코딩에 초보적이다. – RufusV

1

쓰기,

if usernameExists == true && passwordIsValid == true { 
    performSegue(withIdentifier: "loginToGames", sender: self) 
} else { 

    self.incorrectLabel.isHidden = false 
} 

당신의 위의 코드를 받고있다 usernameExistspasswordIsValid 이전에 어떤 값이든 처음 실행됩니다. 최종 완성 처리기에이 코드 스 니펫을 넣으면 문제가 해결됩니다 ...!

+0

죄송합니다. 정확히 어디에 추가해야합니까? 나는 코딩에 초보적이다. – RufusV