Realm에서 Swift의 Array, Dictionary 사용하기

Realm에서 Array, Dictionary 사용하기

Realm에서는 Swift의 Array를 사용할 수 없다. Realm에서는 대신 List<T> 를 사용할 수 있다. 마찬가지로 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를 통해서 직접 저장된 데이터를 확인해보자.