

大変初歩的な質問になってしまうのですが...  
いくつかの参考書載ってある例を読んでみてもRealmの「逆方向の関連」の利便性がイマイチ理解できません。  
Realmの「逆方向の関連」について理解する際に役に立った例などご存知でしたら教えていただけると助かります。


CC BY-SA 3.0
2017-05-30T15:17:40.757
35137
2019-11-02T15:02:05.327
23465
question
realm
Realmの「逆方向の関連」について


必ず使わなければいけないものではないので、使わなくても問題がないのであれば特に気にすることはありませんが、こういうケースで便利という例を用いて説明します。

Twitterのアプリを作ると仮定します。  
モデルはわかりやすさのために簡略化して、下記のような`Tweet`と`User`だけを考えます。

[code]

    class Tweet: Object {
        dynamic var text = ""
        dynamic var creationDate = Date()
        dynamic var user: User?
    }
    
    class User: Object {
        dynamic var name = ""
    }
    
[/code]

`Tweet`クラスにはそのツイートをしたユーザーを１対１の関連として持ちます。  
このときタイムライン（ツイートの一覧）を表示するためのデータは次のようになります。

[code]

    let timeline = realm.objects(Tweet.self)
                        .sorted(byKeyPath: "creationDate", ascending: false)
    
[/code]

`Tweet`を全件取得して、時系列に並べ替えて新しいものから順に並べるのでこのようになります。

このときタイムラインの画面でユーザーをタップしたとき、「そのユーザーのツイートの一覧」を表示したいとします。よくある仕様だと思います。

そのとき、逆方向の関連があると、各`User`のインスタンスから、そのユーザーが関連として持たれている`Tweet`オブジェクトを自動的に取得することができます。これが逆方向の関連の便利なところです。

最初のモデルに逆方向の関連を示すプロパティを追加します。

[code]

    class Tweet: Object {
        dynamic var text = ""
        dynamic var creationDate = Date()
        dynamic var user: User?
    }
    
    class User: Object {
        dynamic var name = ""
        let tweets = LinkingObjects(fromType: Tweet.self, property: "user")
    }
    
[/code]

`User`クラスに`tweets`プロパティが追加されました。`tweets`プロパティは`Tweet`の`user`プロパティの逆関連なので、`Tweet`が関連づけられているユーザーの逆方向、つまりそのユーザーのツイートすべてを表します。

[code]

    let tweet = timeline[indexPath.row]
    let selectedUser = tweet.user
    
[/code]

例えば、上記のようにあるツイートのユーザーを選択すると、次の画面でそのユーザーのツイートすべてを表示するには、

[code]

    let allTweetsOfTheUser = selectedUser?.tweets
    
[/code]

のように`User`クラスの`tweet`プロパティをたどるだけでOKです。  
逆方向の関連がなければ、このようなデータが必要な場合は自分で逆方向の関連を管理する必要があります。逆方向の関連の管理は、`Tweet`に`User`を関連づける際に必ずセットで行わなければいけないので、データの整合性に気をつける必要が出てきます。  
関連が削除された場合なども考慮する必要があります。そういった大変さを解決するのが逆方向の関連です。


CC BY-SA 3.0
2017-05-30T18:10:40.270
35138
2017-05-30T18:10:40.270
5519
35137
answer