Swift

[Swift] 이슈트래킹: Firebase에서 값이 안뜸 (원인: 값을 가져오긴 했는데 closure의 실행 과정에 대한 이해 부족)

Lyla. 2023. 10. 28. 22:27
func fetchMessage() {
    self.ref.child("Message").observe(.value) { snapshot in
        guard let jsonString = snapshot.value as? String else {
            print("데이터를 가져오는 데 실패했습니다.")
            return
        }
        
        do {
            let jsonData = Data(jsonString.utf8)
            let messages = try JSONDecoder().decode([Message].self, from: jsonData)
            
            DispatchQueue.main.async {
                self.messageList = messages

                 //2) 변경해야 하는 print문 위치
                print("count::\(self.messageList.count)")
            }
        } catch {
            print("데이터를 디코딩하는 데 실패했습니다: \(error.localizedDescription)")
        }
    }
    //1)기존에 있었던 print문 위치
        print("count::\(self.messageList.count)")
}

closure -> 다음 실행 위치에서 빠져나와서 실행됨. 

1)의 print문의 실행은 

guard let jsonString = snapshot.value as? String else {}

이 클로저 종료 전임. 

따라서 

 DispatchQueue.main.async {
                self.messageList = messages

                 //2) 변경해야 하는 print문 위치
                print("count::\(self.messageList.count)")
            }

안에서 print해야 알 수 있음. 

 

결론

: closure를 쓸 때는 실행 순서에 유의하자.