Наблюдение за Аутентификацией Firebase с ObservableObject - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь наблюдать за аутентификацией Firebase и соответствующим образом обновлять мой вид.

I have an SessionStore object:

    class SessionStore: ObservableObject {
    @Published var session: Account?
    var handle: AuthStateDidChangeListenerHandle?


    deinit {
        stopListen()
    }

    func listen() {
        if handle == nil {
            handle = Auth.auth().addStateDidChangeListener { (auth, user) in
                if let user = user {
                    print("User logged in: \(user)")
                    self.session = Account.preData
                }  else {
                    self.session = nil
                }

            }
        }
    }

    func stopListen() {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
}

Я использую его в виде, подобном этому:

    struct TabBarView: View {
    @EnvironmentObject var sessionStore: SessionStore

    @State var selectedTab = Tab.swiping
    enum Tab: Int {
        case swiping, matches, profil
    }

    func getUser() {
        sessionStore.listen()
    }


    var body: some View {
        Group {
            if (sessionStore.session != nil) {
                         TabView(selection: $selectedTab) {
                            SwipingView().tabItem {
                                TabBarItem(text: "Text", image: "pause.circle")
                            }.tag(Tab.swiping)
                        }
                    } else {
                        LoginView()
                    }
        }.onAppear(perform: getUser).onDisappear(perform: sessionStore.stopListen)
    }
}

И называю это так:

sessionStore = SessionStore()
TabBarView().environmentObject(sessionStore!)

Но он показывает только LoginView, даже когда сессия не равна нулю. Я сделал некоторые изменения кода, это на самом деле решение.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Я думаю, что это способ сделать это

class SessionStore: ObservableObject {
    @Published var session: Account?

Также вы указали self в закрытии состояния, что означает, что ваш объект никогда не будет деиницироваться. Добавить неизвестное или слабое, например, так:

handle = Auth.auth().addStateDidChangeListener { [unowned self] (auth, user) in

https://www.avanderlee.com/swift/weak-self/

0 голосов
/ 18 октября 2019

Правильная реализация:

class SessionStore: ObservableObject {
    let objectWillChange = ObservableObjectPublisher()
    var session: Account? {
        didSet {
            objectWillChange.send()
        }
    }
    var handle: AuthStateDidChangeListenerHandle?


    deinit {
        stopListen()
    }

    func listen() {
        handle = Auth.auth().addStateDidChangeListener { (auth, user) in
            if let user = user {
                print("User logged in: \(user)")
                self.session = Account.preData
            }  else {
                self.session = nil
            }

        }
    }

    func stopListen() {
        if let handle = handle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
}

Подробнее об этом: https://www.pointfree.co/blog/posts/30-swiftui-and-state-management-corrections

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...