🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

795閲覧

RealmSwiftでResults型の変数にデータが入るタイミング

nullpo33

総合スコア13

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/16 06:00

前提・実現したいこと

RealmSwiftを使ってデータの永続化を行っています。
realm.writeだけでResults型の変数に代入される原理がよくわかりません。

発生している問題

まずはじめに起動時にviewDidLoadでResults型の変数に代入しているのでTableViewに表示されている原理はわかります。

private var realmItem: Results<RealmClass>! override func viewDidLoad() { super.viewDidLoad() do{ self.realmItem = try Realm().objects(RealmClass.self) }catch{ print("error") }   tableView.delegate = self tableView.dataSource = self }

ですがデータを追加する際にResults型realmItemに代入しなくてもrealm.writeだけでrealmItemにデータが代入されている原理がわかりません。

@IBAction func tapButton(_ sender: UIBarButtonItem) { let realm = try! Realm() let realmClass = RealmClass() try! realm.write { realmClass.name = "dummy" realm.add(realmClass) } tableView.reloadData() }

tableView.reloadData()の前に

realmItem = try Realm().objects(RealmClass.self)

に代入しなくても何故追加されるのか教えて欲しいです。
よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

Xcode 11.0
Swift 5.0
Realm 3.18.0
RealmSwift 3.18.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://realm.io/jp/docs/swift/latest/#クエリ
の説明で

Realmにおけるすべてのクエリとプロパティへのアクセスを含むは遅延ロードされます。プロパティにアクセスした時に、初めてデータが読み込まれます。

と説明されている通り、データは、Realmのモデルクラスのプロパティにアクセスしようとした時に初めて読み込まれます。

swift

1realmItem = try Realm().objects(RealmClass.self)

は、RealmClassからデータを読み込むことを登録しているだけで、
この段階でrealmItemの中にデータが読み込まれているわけではありません。

テーブル表示をする際に、

swift

1cell.textLabel.text = realmItem[indexPath.row].name

のようにしてrealmItem内のRealmClassのプロパティにアクセスした時に初めて
実際のデータの読み込みが行われます。

そのため、読み込み時は、常に最新のデータ格納状況が反映されます。

投稿2019/12/17 14:55

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nullpo33

2019/12/17 23:42

よく分かりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問