2016-08-04 6 views
3

ゴール全体で使用単一レルムインスタンス/変数:にメモリフットプリントを削減アプリケーション

私のアプローチはAppDelegateクラス &に単一レルムのインスタンスを作成することですが、その代わりに新しい変数を作成するたびにアクセス。

AppDelegate

lazy var realm: Realm = { 
    let realm = try! Realm() 
    // Get our Realm file's parent directory 
    if let folderPath = realm.configuration.fileURL?.URLByDeletingLastPathComponent?.path{ 
     // Disable file protection for this directory 
     do { 
      try NSFileManager.defaultManager().setAttributes([NSFileProtectionKey: NSFileProtectionNone],ofItemAtPath: folderPath) 
     }catch { 
      printDebug(error) 
     } 
    } 
    return realm 
}() 

のUIViewController

var realm = (UIApplication.sharedApplication().delegate as! AppDelegate).realm 

// Access/Modify realm object 
try! self.realm.write{ 
    location.imageFile = fileName 
} 

質問

1.これはメモリ使用量を減らすのに役立ちますか?

2.欠点は何ですか?

答えて

2

私の意見の主な欠点で

1. 興味深い質問では、レルムとGCDを使うつもりならということです。レルムはスレッドセーフであるため、スレッド/キュー全体でレルムオブジェクトを使用/変更することはできません。

私は、シングルトンであるマネージャでレルムを処理します。たぶん、誰かがより良い解決策を持っているかもしれませんが、これは素晴らしいことです

class CouponManager: NSObject { 
     /// path for realm file 
    lazy private var realmURL: NSURL = { 
     let documentUrl = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)[0] 
     let url = documentUrl.URLByAppendingPathComponent("coupons.realm") 
     return url 
    }() 
    lazy private var config:Realm.Configuration = { 
     return Realm.Configuration(
      fileURL: self.realmURL, 
      inMemoryIdentifier: nil, 
      encryptionKey: "my65bitkey".dataUsingEncoding(NSUTF8StringEncoding), 
      readOnly: false, 
      schemaVersion: 1, 
      migrationBlock: nil, 
      deleteRealmIfMigrationNeeded: false, 
      objectTypes: nil) 
    }() 

    static let shared: CouponManager = CouponManager() 

    func save(coupons coupons:[Coupon]) { 
     let realm = try! Realm(configuration: config) 
     try! realm.write(){ 
      realm.deleteAll() 
      realm.add(coupons) 
     } 
    } 

    func load() -> Results<Coupon> { 
     let realm = try! Realm(configuration: config) 
     return realm.objects(Coupon) 
    } 

    func deleteAll() { 
     let realm = try! Realm(configuration: config) 
     try! realm.write({ 
      realm.deleteAll() 
     }) 
    } 
} 

2. レルムを使用するときは、メモリを心配してはいけません。 としてTiM(彼はRealmで働いています)はthis answerで、あなたが必要とする度にRealmをインスタンス化する必要があります。

+0

私は既にその答えを読んできました。私は私のアプローチでスレッドの安全性を心配していました。レルムインスタンスを作成するたびにエラーが発生しないようにすると、グローバルインスタンスが1つ作成されるため、コードがきれいに保たれます。 私はグローバル変数の代わりにグローバル関数を作成する方が良いと思います。 私は間違ったスレッドからレルムを呼ぶのを避けることができます。また、コードを乾燥したままにしておきます。 –

+0

なぜこのマネージャーを持っているのか、それぞれの方法でなぜレルムのインスタンスを作成するのでしょうか。それはきれいに見えますが、シングルトンが最悪の解決策であると言う人もいます。 –

+0

最終的にはシングルトンのみを使用します。また、私はデフォルトのレルム設定を使用しているので、私はシングルトンを作成する必要はないと思っていますが、あなたのメソッドはいいようです。それは私に地球規模の機能を使う考えを与えました。 :)ありがとう –

2

質問

  1. これは、メモリの使用量を減らすのに役立つでしょうか?

私の経験から、領域の共有インスタンスを取得してURLを設定することは重大な作業ではありません。しかし、トランザクションを何回か開いたり閉じたりすることは(それを頻繁に行うかによって異なりますが、ほとんどのクライアントは十分に書き込んでいません)。 私の答えはで、ではありません。これはメモリの使用に役立ちません。 ところで、あなたのアプリをプロファイリングして、あなたのメモリ使用量を確認しましたか?それは始めるには良い場所です。

  1. どのような欠点がありますか?

私は今ではレルムを使用していましたが、Realmを使用して2つのアプリケーションを作成しました。今私が言っているのは、メモリ使用量ではなく、デザインについてです。

A.あなたが知っているレルムは、データベースです。また、アプリケーションの任意の場所(viewControllerからではなく)の任意の場所からアクセスするだけでなく、特にあなたのクラス(例えばUsersDataBaseクラス)でそれをウェーハに置くことなく、説明します。 DB内のオブジェクトが変化し始めるときには、データベースへの書き込みが誰か、あったかどうかを知る必要があります。 1か所で確認とデバッグができました。私があなたのアプリケーションのすべてにいても、私はデバッグするのが非常に難しいです。

B.レルムはスレッドセーフではありません。それは、あなたが本当に魔法使いのスレッドの領域に書かれていることを知りたがっていることを意味します。もしそうでなければ、あなたはスレッドの実行を終了し、それは対処するのは楽しいことではないと信じています。特にレルムがスタックトレースを何度か助けてくれない時は特にそうです。

C.「UIApplication.sharedApplication()」を使用して、AppDelegateでレルムにアクセスしています。これは、AppExtensionsなどの異なるコンテキストから「UIApplication.sharedApplication()」にアクセスできないため、ベストプラクティスではありません。アプリにアプリの拡張機能を追加したい場合は、アプリの拡張機能を使用している場所をすべて書き直すことになります。

+0

詳細な回答ありがとうございます。私はその部分を "あなたは" UIApplication.sharedApplication() "異なるコンテキストから"アクセスすることができませんでした。以前はそれについて考えなかった。また、レルムを使用するときにバグを見つけることも難しいです。 –

+0

私はメモリリークをチェックするために機器を使用しました。領域の初期化によってメモリリークが発生することが判明しました。 @MCMatan –

+0

あなたはもっと具体的になることができますか?レルムは多くのプロダクションアプリケーションで使用されていますが、私はそれが覚え書き漏れのコースであると言う問題は見られません。(覚え書きの漏れ、またはメモの使用を意味しますか?)おそらく、弱い自己参照を使わずにブロックから何らかのアクションを行っているかもしれません。 – MCMatan

関連する問題