2017-02-01 11 views
5

私はRealmをいくつかの小さなプロジェクトで使ってきました。私はより大きなプロジェクトでそれを使用することに移りたいと考えています。私はデータアクセスレイヤーの構造を改善したいと考えています。Realmでより良いデータアクセスレイヤを書く方法

私はこの類似したquestionに出くわし、私がそこに見つけた情報を構築しようとしました。ここで議論されているアプローチはDAOパターンなので、私はそれを打ちました。

これは私のモデルクラスです。

class Chat: Object { 
    dynamic var id: String = "" 
    dynamic var createdAt: Date = Date() 
    dynamic var creatorId: String = "" 
    dynamic var title: String? 
    let chatMessages = List<ChatMessage>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

    convenience init(fromJSON json: JSON) { 
     self.init() 
     // ... 
    } 
} 

次に、すべての便利ヘルパーメソッドを保持するためにChatDAOProtocolを作成しました。

protocol ChatDAOProtocol { 
    func addMessage(_ message: ChatMessage) 
    func getChatThumbnail() -> UIImage 
    func getParticipants(includingMe: Bool) -> [Participant]? 
    static func getChat(fromId id: String) -> Chat? 
    static func getChat(fromCreatorId id: String) -> Chat? 
} 

は、最後に私は、これらすべてのプロトコルメソッドを実装しChatHelperと呼ばれる別のクラスを作成しました。

class ChatHelper: ChatDAOProtocol { 
    func addMessage(_ message: ChatMessage) { 

    } 

    func getChatThumbnail() -> UIImage { 
     return UIImage() 
    } 

    func getParticipants(includingMe: Bool) -> [Participant]? { 
     return nil 
    } 

    static func getChat(fromId id: String) -> Chat? { 
     return nil 
    } 

    static func getChat(fromCreatorId id: String) -> Chat? { 
     return nil 
    } 

} 

これは、すべてのデータベースに関連するコードをVCのすべてに振りかけるよりも優れています。しかし、私はまだ疑問を持っています。

たとえば、チャットの参加者をすべて取得する必要がある場合は、ChatHelperクラスのメソッドを呼び出す必要があります。チャットのタイトルを取得したい場合は、Chatオブジェクトのtitleプロパティを呼び出します。非常に統一されたインターフェースのようには見えません。ヘルパー内のすべてのプロパティにgetterとsetterを含める必要があります。したがって、Chatオブジェクトは決して直接呼び出されません(インスタンスを作成する場合を除いて)。

それとも

私はChatオブジェクト自体はChatDAOProtocolプロトコルに適合させるべきでしょうか?だから、すべての便利なメソッドとプロパティは直接Chatオブジェクトから直接アクセスできますか?

これらの両方よりも良い方法がありますか?

答えて

2

これは、Realmとの直接的な対話からどのくらい抽象化したいか、そしてRealmのパフォーマンスとどれだけ妥協したいかによって実際にどのくらいの違いがあるかによって決まります。

個人的には、クエリを抽象化してロジックを書くことはできますが、それでもRealmモデルオブジェクトから直接読み込むのは問題ないと思います。別のオブジェクトベースのデータベース(Core Dataのような)に移動した場合、親クラスをリファクタリングしている間にこれらのオブジェクトが他のものに属していた場合(例:RLMObjectNSManagedObject)、これらのオブジェクトからビジネスロジックを読み取る方法は変わりません。

あなたは間違いなく、Realmを非常に非効率的に利用する方法でロジックを抽象化していますが、間違いなく注意する必要があります。

私が見ることのできる主な例は、getParticipantsメソッドにあり、標準のSwift配列を返しています。レルムのResultsオブジェクトをそのように変換すると、要求に応じて遅延読み込みとは対照的に、すべてのオブジェクトがメモリ内にページングされるため、Realmのパフォーマンス上のメリットが大幅に失われます。しかし、Resultsオブジェクトは標準配列のように動作するので、直接返すとビジネスロジックを変更する必要はありません。

オブジェクトのバッチで1つのプロパティを更新する場合は、内部的に書き込みトランザクションを開くヘルパークラスではなく、すべてのオブジェクトが1回の書き込みトランザクションで更新されるようにする方がよいでしょう。ヘルパーメソッドが呼び出されるたびに

+0

返信いただきありがとうございます。あなたが言及したポイントを考慮して、自分のコードを書き直したいと思います。だから、同じ 'Chat'クラスのヘルパーメソッドを使う方が良いとか、ヘルパーメソッドのための別の' ChatHelper'クラスを作る方が良いと思いますか? – Isuru

関連する問題