2016-04-04 8 views
4

私はアプリケーションでレルムを使用していますが、将来私はあまり変更を加えることなくデータベースプロバイダを交換できるように、できるだけ抽象化しようとしています。レルムの永続性のためのデザインパターン

このパターンはうまくいきましたが、私は以下について心配しています。

  • 新しいレルムオブジェクトをオーバーヘッドごとに作成しています(現状ではレルムオブジェクトは内部的にキャッシュされています)。
  • レルムを使用する方法に問題はありますか?
  • 目的に適したデザインパターンはありますか?完全固体デザインパターンです

    public struct BookDataLayer: BookDataLayerProvider { 
    
    func isBookAvailable(bookIdentifier: String) throws -> Bool { 
        let database = try getDatabase() 
        return !database.objects(Book).filter("identifier = %@", bookIdentifier).isEmpty 
    } 
    
    func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws { 
        let book = Book() 
        Book.bookIdentifier = bookIdentifier 
        Book.sortIndex = sortIndex 
        try create(book, update: true) 
    }} 
    
    protocol BookDataLayerProvider : DataAccessLayer { 
        func isBookAvailable(bookIdentifier: String) throws -> Bool 
        func createOrUpdateBook(bookIdentifier: String, sortIndex: Int) throws n} 
    
        extension DataAccessLayer { 
    
    func getDatabase() throws -> Realm { 
        do { 
         let realm = try Realm() 
         // Advance the transaction to the most recent state 
         realm.refresh() 
         return realm 
        } catch { 
         throw DataAccessError.DatastoreConnectionError 
        } 
    } 
    
    func create(object: Object, update: Bool = false) throws { 
        let database = try self.getDatabase() 
    
        do { 
         database.beginWrite() 
         database.add(object, update: update) 
         // Commit the write transaction 
         // to make this data available to other threads 
         try database.commitWrite() 
        } catch { 
         throw DataAccessError.InsertError 
        } 
    }} 
    
    // Usage 
    let bookDataLayer = BookDataLayer() 
    bookDataLayer.isBookAvailable("4557788") 
    
    bookDataLayer.createOrUpdateBook("45578899", 10) 
    

答えて

3

。開発者がデータレイヤAPIをコードから抽象化して、コードレイヤを切り替える必要がある場合は、かなり一般的です。あなたの質問に応えて

  • あなたが正しいです。 Realmオブジェクトインスタンスは内部的にキャッシュされているため、わずかなオーバーヘッドで簡単にlet realm = try! Realm()を複数回呼び出すことができます。
  • 特定の理由が見つからない限り、Realmインスタンスを使用するたびにrefresh()に電話する必要はないでしょう。メインスレッドのRealmインスタンスは、実行ループの各繰り返しで自動的にリフレッシュされるため、バックグラウンドスレッドの変更が必要な場合、または現在の実行ループが完了する前に変更にアクセスする必要がある場合は、refresh()に電話する必要があります。
  • 「Better」デザインパターンはおそらく意見の問題ですが、私が他のコードベースから見たものから、あなたが持っているものはすでに素晴らしいです! :)
+0

私にお答えする時間を取ってくれてありがとう。私は今までレルムを愛しています。あなたの答えは本当に役に立ちます。 – Jani

+0

私の喜び!あなたが私の答えを見つけたことをうれしく思います!あなたがレルムを楽しんでいるのを聞いて神様!それ以上の質問があればお気軽に! :) – TiM