Swift

[Swift] FirebaseDatabase 채팅 기능 upload/fetch 예제

Lyla. 2023. 10. 28. 23:06
final class ChatViewModel:ObservableObject {
    
    var ref: DatabaseReference! = Database.database().reference()
    
    @Published var messageList: [Message] = []
        
    //MARK: - 메세지 업로드(Create)
    func sendMessage(_ messageContent: String){
        var tempMessageList: [Message] = self.messageList
        let tempMessage: Message = Message(sender: "보낸이", content: messageContent, timeStamp: Date().timeIntervalSince1970)
        tempMessageList.append(tempMessage)
        
        do {
               let jsonData = try JSONEncoder().encode(tempMessageList)
               if let jsonString = String(data: jsonData, encoding: .utf8) {
                   self.ref.child("Message").setValue(jsonString)
               }
           } catch {
               print("데이터를 JSON으로 변환하는 데 실패했습니다: \(error.localizedDescription)")
           }
    }
    
    //MARK: - 메세지 패치(Read)
    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
                        print("count2::\(self.messageList.count)")

                    }
                    // messageList를 업데이트하고 UI를 갱신하는 로직을 추가하세요.
                    print("데이터를 디코딩완료:\(messages)")
                    print("\(self.messageList)")
                } catch {
                    print("데이터를 디코딩하는 데 실패했습니다: \(error.localizedDescription)")
                }
            }
        print("count::\(self.messageList.count)")
    }
}