-
[Swift] 이슈트래킹: Firebase에서 값이 안뜸 (원인: 값을 가져오긴 했는데 closure의 실행 과정에 대한 이해 부족)Swift 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를 쓸 때는 실행 순서에 유의하자.
'Swift' 카테고리의 다른 글
lazy 코드 : 지연 초기화, 해당 프로퍼티 사용될 때 까지 초기화 되지 않음. (0) 2023.12.21 [Swift] FirebaseDatabase 채팅 기능 upload/fetch 예제 (0) 2023.10.28 Codable 프로토콜 (0) 2023.10.28 네이버 지도 이용시 멀티스레딩 (0) 2023.09.24 의존성 주입 (0) 2023.09.24