๐ŸŽ iOS & Swift

[iOS] Realm ์ข€ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ(with Singleton class)

taeeekki 2022. 8. 25. 12:13

๋“ค์–ด๊ฐ€๋ฉฐ

์‚ฌ์‹ค ๋˜‘๋˜‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด์ง€ ์•„๋‹Œ์ง€ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ชจ์ˆœ์ด ์žˆ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„ ์ฝ”๋“œ ๊ฐœ์„ ์„ ํ•ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์œผ๋‹ˆ ๊ธฐ๋ก์„ ๋‚จ๊ฒจ๋ณด๊ฒ ๋‹ค.... (๊ณ ๋ฏผ์˜ ํ”์ )... Realm์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ•œ์ •์ ์ด๊ณ  ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ณณ์— ๋ชจ์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ Manager ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ž˜ ๋งŒ๋“  ๊ฑด์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ทธ๋ž˜๋„ ํ™•์‹คํžˆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ํŽธํ•ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ๋‹ค. ๋ฐ”๋กœ ํ•œ ๋ฒˆ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž!


์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐ

1. ๊ตฌํ˜„๋ถ€

// ๊ตฌํ˜„๋ถ€

import UIKit
import RealmSwift

protocol DataBase {
    func read<T: Object>(_ object: T.Type) -> Results<T>
    func write<T: Object>(_ object: T)
    func delete<T: Object>(_ object: T)
    func sort<T: Object>(_ object: T.Type, by keyPath: String, ascending: Bool) -> Results<T>
}

final class DataBaseManager: DataBase {

    static let shared = DataBaseManager()

    private let database: Realm

    private init() {
        self.database = try! Realm()
    }

    func getLocationOfDefaultRealm() {
        print("Realm is located at:", database.configuration.fileURL!)
    }

    func read<T: Object>(_ object: T.Type) -> Results<T> {
        return database.objects(object)
    }

    func write<T: Object>(_ object: T) {
        do {
            try database.write {
                database.add(object, update: .modified)
                print("New Item")
            }

        } catch let error {
            print(error)
        }
    }

    func update<T: Object>(_ object: T, completion: @escaping ((T) -> ())) {
        do {
            try database.write {
                completion(object)
            }

        } catch let error {
            print(error)
        }
    }

    func delete<T: Object>(_ object: T) {
        do {
            try database.write {
                database.delete(object)
                print("Delete Success")
            }

        } catch let error {
            print(error)
        }
    }

    func sort<T: Object>(_ object: T.Type, by keyPath: String, ascending: Bool = true) -> Results<T> {
        return database.objects(object).sorted(byKeyPath: keyPath, ascending: ascending)
    }
}

ํ”„๋กœํ† ์ฝœ๊ณผ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๊ณ , ๊ตฌํ˜„์€ ํด๋ž˜์Šค ๋‚ด์—์„œ ํ•ด์ฃผ์—ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์„œ ํ”„๋กœ์ ํŠธ ๊ณณ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๊ณ , ์ดˆ๊ธฐํ™” ์‹œ์ ์— Realm ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  privateํ•˜๊ฒŒ ์ ‘๊ทผ์„ ์ œ์–ดํ•ด์ฃผ์–ด์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ์—ˆ๋‹ค.

2. ์‚ฌ์šฉ๋ถ€

์‚ฌ์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

// ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ
private let database = DataBaseManager.shared

// Realm ํŒŒ์ผ ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ
database.getLocationOfDefaultRealm()

// Create
let task = Shopping(title: inputTextField.text!, createdAt: Date())
database.write(task)

// Read
shoppingList = database.read(Shopping.self)

// Update
tasks = database.sort(Shopping.self, by: "title")

// Delete
database.delete(self.shoppingList[indexPath.row])


๋งˆ๋ฌด๋ฆฌ

๋‚˜๋ฆ„ ๋งŒ๋“ค์–ด๋ณด์•„์„œ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ ์กฐ๊ธˆ ๋” ์ข‹์€ ๋ฐฉ์‹์„ ์ฐพ๊ฒŒ๋˜๋ฉด ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.