Передача args для файла dockerfile, а затем связанная с ним по переменной TARGETOS.
CMD:
export TARGETOS=windowsservercore-1803
docker-compose build
docker-compose.yml:
f2]
Файл докеров:
ARG TARGETOS
ENV TARGETOS ${TARGETOS}
# do things based on TARGETOS arg
# RUN if [ ${TARGETOS} = "windowsservercore-1803" ]; then \
Ну, я пытался добавить кое-что в ваш код, но это немного сложно для чтения. Вы должны действительно подумать о рефакторинге.
В любом случае, проблема в том, что вы никогда не ждете, пока результат запроса вернется, и просто даете ему выполнить. Помните, что Firebase является асинхронным. В вашем случае я предлагаю вам использовать блок завершения для метода isValidUsername
. Вот код для вас. Не уверен, что он будет работать, поскольку я не могу скомпилировать без создания всех компонентов пользовательского интерфейса, которые у вас есть. В приведенном ниже коде я удалил кучу вашего кода, который изменяет пользовательский интерфейс, если он не проверен. Я также удалил ваши проверенные переменные, так как в этом случае они вам больше не понадобятся. Я прокомментировал весь код, который я добавил, чтобы вам было легче его понять.
@IBAction func onSignUp(_ sender: Any) {
print("Sign Up pressed")
guard let email = emailTextField.text else { return }
guard let password = passwordTextField.text else { return }
guard let userName = usernameTextField.text else { return }
if isValidEmail(email: email) && isValidPassword(password: password) {
// HERE YOU USE THE CLOSURE
isValidUsername(username: userName) { (verified, error) in
if error != nil {
// IF THERE IS ERROR RETURN
return
}
guard let verified = verified else { return }
// IF IT IS A VALID USERNAME, PROCEED WITH SIGNUP
if verified {
Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
if error != nil {
return
}
guard let user = authResult?.user else {
return
}
//Successfully Authenticated User
let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
let usersReference = ref.child("users").child(user.uid)
let values = ["username": self.usernameTextField.text!, "email": self.emailTextField.text!, "games-played": "0"]
usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
if err != nil {
print(err!)
return
}
//Successfully registered user's data to database
print("[SIGN UP] - Successfully Signed Up")
self.present((self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController"))!, animated: false, completion: nil)
})
}
}
}
} else {
}
}
//MARKUP: Validations/Verifications
//Email Verification (Must follow correct email format: example@gmail.com)
func isValidEmail(email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
if valid {
valid = !email.contains("Invalid email id")
}
if valid == false {
return false
} else {
return true
}
}
//Password Verification (Must be greater than 8 digits
func isValidPassword(password: String) -> Bool {
let passwordRegex = ".{8,}"
var valid = NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)
if valid {
valid = !password.contains("Invalid password id")
}
if valid == false {
return false
} else {
return true
}
}
//Username Verification (Must be between 3-15 charaters w/ username not taken)
// HERE IS A CLOSURE
typealias validateClosure = (Bool?, Error?) -> Void
func isValidUsername(username: String, completion: @escaping validateClosure) {
let usernameRegex = ".{3,15}"
var valid = NSPredicate(format: "SELF MATCHES %@", usernameRegex).evaluate(with: username)
if valid {
valid = !username.contains("Invalid username id")
}
if valid == false {
} else {
let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
let usernamesRef = ref.child("users")
usernamesRef.queryOrdered(byChild: "username").queryEqual(toValue: username).observeSingleEvent(of: .value, with: { (snapshot) in
// if there is data in the snapshot reject the registration else allow it
if (snapshot.value! is NSNull) {
// RETURN TRUE IF VERIFIED
completion(true, nil)
} else {
// RETURN FALSE IF NOT VARIFIED
completion(false, nil)
}
}) { (error) in
// RETURN FALSE AND THE ERROR
completion(false, error)
print(error.localizedDescription)
}
}
}
Надеюсь, это поможет. И, пожалуйста, действительно подумайте о переносе всего кода, который выполняет сетевые вызовы и бизнес-логику, в другой класс и из viewController. Это сделает вашу жизнь намного легче позже.