Realm에서 Array, Dictionary 사용하기

  • Realm에서는 Swift의 Array를 사용할 수 없다.
  • Realm에서는 대신 List 를 사용할 수 있다.
  • 마찬가지로 Dictionary 또한 사용할 수 없다.
  • 대신 Dictionary를 하나의 객체로 만들어 사용할 수 있다.
  • Realm 에서 Swift에서 흔히 볼 수 있는 Dictionary를 담은 Array([[String: String]])을 만들어보고, 각각의 속성에 접근해보자.

기본 조건

  • 해당 앱은 채팅 앱으로 내가 보낸 메시지와 타인이 보낸 메시지를 구분해서 순서대로 저장해야 한다.
  • 채팅 내역은 UITableView로 구현되어 있다.

ChatModel

  • 채팅 내역이 저장될 Model 클래스
import Foundation
import RealmSwift

class ChatModel: Object {
    var contents = List<Content>()
}

class Content: Object {
    @objc dynamic var sender = ""
    @objc dynamic var message = ""
}

ViewController.swift

import UIKit
import RealmSwift

class ViewController: UIViewController {
    
    ...
    
    // Realm 객체 생성
    let realm = try! Realm()
    
    
    
    // 내가 메시지를 보낼 경우
    func sendMessage(text: String) {
        
        // Realm에서 제공하는 방식으로 초기화
        let content = Content(value: ["sender": "나", "message": text])
        
        // 아직까지 한번도 저장하지 않은 경우 
        if realm.objects(ChatModel.self).isEmpty == true {
            
            // chatModel을 생성하고 저장
            let chatModel = ChatModel()
            chatModel.contents.append(content)
            
            try! realm.write {
                realm.add(chatModel)
            }
            
        // 만약 이전에 저장했다면 변경
        } else {
            try! realm.write {
                let chatModel = realm.objects(ChatModel.self)
                chatModel.first?.contents.append(content)
            }
        }
    }
    
    // 내가 메시지를 받을 경우
    func receiveMessage(sender: String, text: String) {
    
        let content = Content(value: ["sender": sender, "message": text)
            
            // 마찬가지로 있는 경우 새로 저장하고 없는 경우는 변경
            if realm.objects(ChatModel.self).isEmpty == true {
                let chatModel = ChatModel()
                chatModel.contents.append(content)
            } else {
                try! realm.write {
                    let chatModel = realm.objects(ChatModel.self)
                    chatModel.first?.contents.append(content)
                }
            }
    }
    
    ...
    
}

UITableView와 응용해보기

  • 저장되어 있는 채팅 내역을 통해 sender가 나라면 sendCell을, 타인이라면 receiveCell을 각각 만들어보자.

ViewController.swift

extension ChatViewController: UITableViewDataSource {
    
    ...
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let sendCell = tableView.dequeueReusableCell(withIdentifier: "send cell", for: indexPath) as? SendTableViewCell
        let receiveCell = tableView.dequeueReusableCell(withIdentifier: "receive cell", for: indexPath) as? ReceiveTableViewCell
        
        // Realm 데이터 불러오기
        let chatModel = realm.objects(ChatModel.self)
        
        if chatModel.first?.contents[indexPath.row].sender == "나" {
            sendCell?.messageLabel.text = chatModel.first?.contents[indexPath.row].message
            return sendCell!
        } else if chatModel.first?.contents[indexPath.row].sender == "상담원" {
            receiveCell?.messageLabel.text = chatModel.first?.contents[indexPath.row].message
            return receiveCell!
        }
        
        return UITableViewCell()
    }
    
    ...
    
}

데이터 확인

  • Realm의 장점 중 하나인 Realm Studio를 통해서 직접 저장된 데이터를 확인해보자.