2021年8月11日水曜日

RealmSwift はモデルだけ定義してあとは必要な箇所で RealmSwift を import するのが良さそう

RealmSwift はモデルだけ定義してあとは必要な箇所で RealmSwift を import するのが良さそう

概要

RealmSwift を扱う場合にモデルと CRUD 操作をどこに書くのがいいかなと悩んでいます 個人的にはシンプルに使いたいところで使う方式が一番しっくり来たので備忘録として残しておきます

環境

  • macOS 11.5
  • Xcode 12.5.1

モデルだけ定義する

Realm の基本的な使い方としてモデルを定義すると思うのですがそのモデル内では余計なことはしないようにします

単純にモデルだけを定義します

import RealmSwift

class BoardConfig: Object {
    @objc dynamic var name: String = ""
    @objc dynamic var point: Int = 0
}

View 側でモデルを使う

データの保存が取得は基本的に UIViewController などで行います view 側にも import RealmSwift が必要でかつデータにアクセスするために Realm() オブジェクトを生成する必要がありますが余計なことを考えなくて済むのでこの方法がベストだと思います

class BoardConfigViewController: UIViewController {
    override func viewDidLoad() {
        // データの保存
        let config = BoardConfig()
        config.name = "board1"
        config.point = 20
        let realm = try! Realm()
        try! realm.write {
            realm.add(config)
        }
        // データの取得
        let configs = realm.objects(BoardConfig.self)
        for config in configs {
            print(config)
        }
    }
}

上記では viewDidLoad で行っていますが Realm へのアクセスが必要な箇所で上記を呼び出す感じになります

Realm のオブジェクトを毎回生成するとあれなので Realm のオブジェクトはメンバー変数として扱っても良いかなと思います

アンチパターンっぽい書き方は

過去にモデルのクラスにデータを保存するメソッドやデータを取得するメソッドを作成していたのですがそれだとモデルを view 側でも扱うしモデル側でも扱う必要がありコードが重複している感がありました

CRUD 処理をまとめるという意味では良かったかもしれないのですがデータの変換などを考えると結局コードがごちゃごちゃするので微妙かなと思った感じです

モデルはあくまでもモデルでそれを view 側で変換したりするほうが結果的にキレイにコードになる印象です

最後に

結局シンプルなのが一番です

0 件のコメント:

コメントを投稿