Создать функцию входа в Firebase с обработчиком завершения - PullRequest
0 голосов
/ 22 марта 2020

Я хотел бы иметь глобальный func signIn, который я мог бы использовать внутри своего приложения, но моя проблема в том, что мне нужно вызвать несколько functions после создания пользователя. Я думал, что мог бы использовать completion handler для этого, но я попробовал это так, что дает мне ошибку:

static func signIn(credentials: Any?, username: String, finished: () -> Void){
    Auth.auth().signIn(with: credentials as! AuthCredential, completion: { (user, error) in
        if error != nil {
            Utilities.showErrorPopUp(labelContent: "Fehler bei Kontoerstellung", description: error!.localizedDescription)
        } else {
            //user was created successfully; store name, username and UID
            let db = Firestore.firestore()

            let userID = user!.user.uid

            db.collection("users").document(userID).setData(["username": username, "uid": user!.user.uid]) { (error) in
                if error != nil {
                    Utilities.showErrorPopUp(labelContent: "Fehler", description: error!.localizedDescription)
                }
            }
            // generate empty "Main Wishlist"
            db.collection("users").document(userID).collection("wishlists").document("Main Wishlist").setData(["name": "Main Wishlist", "listIDX": 1]) { (error) in
                if error != nil {
                    Utilities.showErrorPopUp(labelContent: "Fehler", description: error!.localizedDescription)
                }
            }

            // set user status to logged-in
            UserDefaults.standard.setIsLoggedIn(value: true)
            UserDefaults.standard.synchronize()

            finished()

        }
    })
}

Ошибка:

Escape замыкание захватывает неэкранирующий параметр 'Закончено'

До изменения мой function выглядел следующим образом:

Auth.auth().signIn(with: credentials, completion: { (user, error) in
                    if error != nil {
                        Utilities.showErrorPopUp(labelContent: "Fehler bei Kontoerstellung", description: error!.localizedDescription)
                    } else {
                        //user was created successfully; store name, username and UID
                        let db = Firestore.firestore()

                        let userID = user!.user.uid

                        db.collection("users").document(userID).setData(["username": username, "uid": user!.user.uid]) { (error) in
                            if error != nil {
                                Utilities.showErrorPopUp(labelContent: "Fehler", description: error!.localizedDescription)
                            }
                        }
                        // generate empty "Main Wishlist"
                        db.collection("users").document(userID).collection("wishlists").document("Main Wishlist").setData(["name": "Main Wishlist", "listIDX": 1]) { (error) in
                            if error != nil {
                                Utilities.showErrorPopUp(labelContent: "Fehler", description: error!.localizedDescription)
                            }
                        }

                        // set user status to logged-in
                        UserDefaults.standard.setIsLoggedIn(value: true)
                        UserDefaults.standard.synchronize()

                        // stop animation
                        self.logoAnimation.stop()

                        //transition to home
                        self.transitionToHome()
                    }
                })
            }

Как вы можете видеть в этом примере, я звоню self.logoAnimation.stop() и self.transitionToHome().

Как я могу превзойти метод, но при этом вызывать методы, когда пользователь зарегистрирован?

Если что-то неясно, просто дайте мне знать:)

1 Ответ

1 голос
/ 22 марта 2020

РЕДАКТИРОВАТЬ: я добавил пакетную запись.

static func signIn(credentials: Any?, username: String, finished: @escaping (_ done: Bool) -> Void) {

    guard let credentials = credentials as? AuthCredential else {

        finished(false)
        return

    }

    Auth.auth().signIn(with: credentials, completion: { (result, error) in

        if let userId = result?.user.uid { // successfully signed in

            let batch = Firestore.firestore().batch()

            batch.setData(["username": username, "uid": userId], forDocument: Firestore.firestore().collection("users").document(userId), merge: true)
            batch.setData(["name": "Main Wishlist", "listIDX": 1], forDocument: Firestore.firestore().collection("users").document(userId).collection("wishlists").document("Main Wishlist"), merge: true)

            batch.commit { (error) in

                if let error = error {
                    print(error)
                    // maybe sign user out and on completion call finished(false)
                    // whatever you do, you must call finished(false) at some point
                } else {

                    UserDefaults.standard.setIsLoggedIn(value: true)
                    UserDefaults.standard.synchronize()
                    finished(true) // sign-in process complete

                }

            }

        } else { // could not sign in

            if let error = error {
                print(error)
            }
            finished(false)

        }

    })

}

Вызов этого метода будет выглядеть следующим образом:

signIn(credentials: credentials, username: someString, finished: { (done) in

    if done { // success
        ...
    } else { // failure
        ...
    }

}
...