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를 쓸 때는 실행 순서에 유의하자.