Как происходит поток данных внутри замыканий в классе Swift

#swift #swiftui #dataflow

Вопрос:

Я упростил этот код из своей программы. Мне нужно лучше понять, как эти данные передаются. Что я хочу сделать, так это запустить функцию getChats, запросить имя пользователя, присвоить имя пользователя имени текущего пользователя и использовать его в другом месте. Что происходит, так это то, что, как только функциональный блок getChats заканчивается, он повторно инициализирует переменную в пустое значение. Почему он перезаписывает его пустой строкой? То же самое с chatsToMe, он написан с некоторой непустой информацией, функция заканчивается, и она повторно инициализируется в пустое состояние.

 class SessionHandler: ObservableObject {

@Published private(set) var userSession: UserSession = initUserSession()

var currentUserUsername: String = ""
var chatsToMe = [Message]()

func initUserSession() -> UserSession {

    func getChats() -> [Message] {
        //This could be more complex, run server query, etc. for now...
        
        userInformationDatabaseRoot.queryOrdered(byChild: "authId")
            .queryEqual(toValue: Auth.auth().currentUser?.uid)
            .observeSingleEvent(of: .value, with: { snapshot in
                if !snapshot.exists() {
                    print (Auth.auth().currentUser?.uid ?? "")
                    print ("The ID doesn't exist")
                }
                else {
                    
                    let user = snapshot.value as? NSDictionary
                    self.currentUserUsername = user?.allKeys[0] as! String
                }
            })
        let _ = chatDatabaseRoot.child(self.currentUserUsername).observe(DataEventType.childAdded) { snapshot in
            if let chats = snapshot.value as? NSDictionary {
                let chat = Message(senderUsername: chats["sender"] as? String, recipientUsername: currentUserUsername, emoji: chats["emoji"] as? String)
                print(chat)
                chatsToMe.append(chat)
            }
        }

    return UserSession(chatsToMe: getChats())
}