2016-07-30 2 views
3

프로젝트의이 부분을 수행하는 데 너무 가깝습니다. 나는 많은 것을 배웠지 만 이것을 볼 수는 없다. 전자 메일 주소가 이미 다른 사용자에 의해 사용되고 있는지 확인하기 위해 노력하고 있습니다.Firebase 사용자 이름을 반환 할 때의 iOS 비동기 작업 문제

func emailCheck(input : String, result:(canRegister: Bool?) -> Void){ 
    var canRegister : Bool? 
    FIRAuth.auth()?.signInWithEmail(input, password: " "){(user, error) in 
     if error != nil { 
      if(error?.code == 17009){ 
       print("Wrong Password") 
       canRegister = false 
      }else if(error?.code == 17011){ 
       print("Unknown User") 
       canRegister = true 
      }else{ 
       canRegister = false 
      } 
     } 
    } 
} 

이 모든 Async 일이 나에게 단지 6 시간 이전, 그래서 당신이 어떤 제안이 있으면 알려 주시기 바랍니다 :이 작업을 수행하려면이 코드를 사용하고 있습니다. 버튼을 누를 때이 기능은 그럼 그냥 이렇게하면 호출됩니다 어떤 이유

print(emailCheck(emailTxt.text!){(canRegister : Bool?) -> Void in}) 

, 이것은하지 true, false 또는 nil을 빈 반환합니다. 그것은 단지 ()을 반환하지만, 올바른 암호를 전달할 때 Wrong Password을 반환합니다. 관련이 있는지 확실하지 않습니다. 아무도 이것으로 손을 빌려줄 수 있습니까? 감사합니다 여러분!

추가 정보는는 제안 후, 코드 및 코드에 대한 참조는 이제 다음과 같습니다

class LoginViewController: UIViewController { 
@IBAction func nextScreen(sender: UIButton) { 
emailCheck(emailTxt.text!) { isValid in 
       if isValid { 
        print("Valid!") 
       } else { 
        print("Invalid!") 
       } 
      } 
} 
func emailCheck(input: String, callback: (isValid: Bool) -> Void) { 
    FIRAuth.auth()?.signInWithEmail(input, password: "") { (user, error) in 
     var canRegister = false 

     if error != nil { 
      if (error?.code == 17009) { 
       //wrong password error 
      } else if(error?.code == 17011) { 
       //email doesn't exist 
       canRegister = true 
      } 
     } 

     callback(isValid: canRegister) 
    } 
} 

이 뒤에 생각 과정은 (만 중요한 부분을 포함) 반환 코드 인 경우 그 사용자가 존재하지 않으면 전자 메일 계정이 열리게되어 따라서 canRegister이 허용됩니다. 그렇지 않으면 빈 암호가 전달 된 경우 계정이 존재하므로 등록되어 있지 않습니다. 사용. 위로 함수 호출에

var canRegister = false 

: 현재, canRegister이 같은 정의된다 무엇이든 동일한 값을 반환합니다.

+0

업데이트 된 코드가 나에게 올바른 보인다. 어떤 이유로 Firebase에서 오류 코드 17011이 다시 발생하지 않는 것 같습니다. 자신의 문서를 파고 들자면 API가 예상대로 작동하지 않는다고 생각합니다. 에 따르면이 페이지는 (https://firebase.google.com/docs/reference/ios/firebaseauth/interface_f_i_r_auth_errors)는'FIRAuthErrorCodeUserNotFound' 오류가 _ "사용자 계정이 아니 었 나타냅니다 (이 사용한 17011 코드와 일치) 사용자 계정이 삭제 된 경우 발견했다.이 발생할 수 있습니다. "_ 그것은 내게 분명하지 않다 즉 해당 오류가 발생하는 경우에만 경우 ... – dbburgess

+0

을 어떤 경우에, 당신이 시도하고있는 무슨의 루트에 더 받고 너를 위해 그들이 처리하는 걸 처리하려고하는 것 같아. 은'createUserWithEmail' 방법의 [워드 프로세서] (https://firebase.google.com/docs/reference/ios/firebaseauth/interface_f_i_r_auth.html#aeaee7fcef878990954f8e72f7278cd7d) 그것이 그렇게 보이는 'FIRAuthErrorCodeEmailAlreadyInUse' 오류를 발생시킬 수라고 당신이 당신 자신을 다루려고 노력하고있는 것입니다. 단순히 오류를 생성하고이 오류를 처리하지 않는 이유는 무엇입니까? – dbburgess

+1

@dbburgess 당신은 그것이 무엇인지 압니까? '... signInWithEmail (input, password : "") ...''password'에는 빈 공간이 없었기 때문에 firebase은 빈 암호로 그것을 읽지 않았습니다. 'nil'은 에러를 발생시키지 않습니다. 모든 도움을 주셔서 감사합니다! – Ethan

답변

1

반환 값 emailCheck을 인쇄하고 있는데, 이는 사용자가 원하는 것이 아닙니다. Async는 나중에 코드의 일부가 실행될 것임을 의미합니다. 다음과 같은 간단한 함수를 고려해보십시오.

func emailCheck(input: String) -> Bool { 
    var valid = true 

    if input.characters.count == 0 { 
    valid = false 
    } 

    return valid 
} 

이것은 이메일에 문자가 두 개 이상 있는지 단순히 확인합니다. 상당히 단순화 될 수 있지만 차이점을 설명하기 위해 좀 더 상세하게 설명했습니다. 우리는 방법은 비동기 적으로 작업을 수행 할 수 있으려면

let isValid = emailCheck("[email protected]") 

if isValid { 
    print("Valid!") 
} else { 
    print("Invalid!") 
} 

, 우리가 콜백 제공 할 것 : 그것을 사용하려면, 당신은 단순히 같은 것을 할 것입니다. 콜백은 함수가 직접 반환하는 대신 결과가 무엇인지 알 수 있도록 호출 할 수있는 함수입니다. 여기에 그 모습입니다 :

func emailCheck(input: String, callback: (isValid: Bool) -> Void) { 
    var valid = true 

    if input.characters.count == 0 { 
     valid = false 
    } 

    callback(isValid: valid) 
} 

func callback(isValid: Bool) { 
    if isValid { 
     print("Valid!") 
    } else { 
     print("Invalid!") 
    } 
} 

emailCheck("[email protected]", callback: callback) 

emailCheck이 더 이상 반환 값, 실제로 결과에 콜백 메소드를 실행합니다. 콜백이 즉시 실행되기 때문에 이것은 진정으로 비동기는 아니지만 원하는 경우 비동기적인 작업을 수행 할 수 있습니다.

Swift는 위에서 설명한 것처럼 명시 적으로 선언하지 않고 콜백을 마지막 매개 변수로 전달할 수있는 깔끔한 구문 설탕을 가지고 있습니다. 이것이 Firebase의 signInWithEmail 메소드에 사용중인 것입니다.이 코드에서이 코드를 사용하면 다음과 같이 보입니다.

emailCheck("[email protected]") { isValid in 
    if isValid { 
     print("Valid!") 
    } else { 
     print("Invalid!") 
    } 
} 

정확히 같은 일을하지만,이 경우에는 조금 더 멋지게 보입니다. 이제 전자 메일을 검사 할 수있는 좋은 설정과 전자 메일이 유효한지 여부를 알았을 때 나중에 실행할 수있는 코드가 있습니다. 모두 함께 퍼팅 :

func emailCheck(input: String, callback: (isValid: Bool) -> Void) { 
    FIRAuth.auth()?.signInWithEmail(input, password: " ") { (user, error) in 
     var canRegister = false 

     if error != nil { 
      if (error?.code == 17009) { 
       print("Wrong Password") 
      } else if(error?.code == 17011) { 
       print("Unknown User") 
       canRegister = true 
      } 
     } 

     callback(isValid: canRegister) 
    } 
} 


var availableEmail = false 

emailCheck("[email protected]") { isValid in 
    if isValid { 
     print("Valid!") 
    } else { 
     print("Invalid!") 
    } 

    availableEmail = isValid 
    // This prints **second**, and should print `true`, if `isValid` was true. 
    print(availableEmail) 
} 

// This prints **first**, and should print `false`, because the callback likely has not run yet. 
print(availableEmail) 

편집 : 그 위의 print 코드/코멘트는 콜백 메서드를 사용할 때 변수가 바로 업데이트되지 않는 방법을 설명을 참조하십시오.

추가 편집 : 또 다른 방법은 명확성을 위해 다른 함수를 사용하여, 그것은을 구성하기 :

emailCheck("[email protected]") { isValid in 
    if isValid { 
     print("Valid!") 
    } else { 
     print("Invalid!") 
    } 

    self.emailCheckComplete(isValid) 
} 

func emailCheckComplete(availableEmail: Bool) { 
    // This is the same as above, but perhaps helps you follow the flow. 
    print(availableEmail) 
} 
+1

음, 그래,'isValid'는'Bool'을 입력합니다, 그래서 당신은'콜백 (isValid : true)를 할 수있는 '하지만 이메일은 무엇을 가지고가는 경우에? false를 사용하고 싶습니다. 그래서'canRegister'도 사용했는데'canRegister' 또한'Bool'이며 true/false로 설정되어 있습니다. – dbburgess

+1

내 예에서,'emailCheck' 어쩌면 당신이 비록 무슨 뜻인지 이해하지 못하는거야, _any_ 값을 반환하지 않습니다. – dbburgess

+1

예제를 기반으로 변경 한 내용으로 게시물을 편집 할 수 있습니까? 업데이트 된 코드가 무엇을 의미하는지 이해하는 것이 도움이 될 것입니다. – dbburgess

관련 문제