2016-11-08 19 views
1

これは重複した質問ではありません。シングルトンからレルムにアクセスすると捕捉されないRLMException

私はRealmBackendシングルトンをDispatchQueueで使用すると、 "RLMException"、理由: '不正なスレッドからアクセスされた領域'エラーメッセージが表示されます。

これは私のクラスである:

class RealmBackend { 

    static let shared = RealmBackend() 
    var realm = try? Realm() 
} 

realm.commitWrite()にアクセスしているaddObject()のようなことで機能やrealm.beginWrite()機能があります。私はレルムオブジェクトがmainスレッド上に作成されたと仮定していますので、

は、今私は(私はあなたがインスタンス化し、アクセスするために同じスレッドを必要とすることをGitHubの上でどこかで読んDispatchQueue.main.syncでコールバック(UIRefreshControl)からaddObject関数を呼び出しますRealm()値)。

私が前に述べたように、私はいつもこれを得るRLMException、誰かが同じ問題に直面していますか?

+0

ディスパッチキューのバックグラウンドスレッドでRealmインスタンスを作成する必要があるのは、ディスパッチキューのバックグラウンドスレッドのRealmインスタンスを作成する必要があるからです。また、明示的な自動解放プールに配置することもお勧めします。 – EpicPandaForce

+0

@EpicPandaForce少しのコード例を回答に投稿できますか?私もそれを試してみましたが(私のシングルトンのプライベート・イニシエートで)、それは私に奇妙なエラーを与えました。 – phipsG

+0

Realmインスタンスをバックグラウンドスレッドで作成するだけでは、メインスレッドでもインスタンスを使用することが期待される場合は、十分ではありません。別々のRealmインスタンスを使用していることを確認する必要があります。スレッドごとに1つ私はこれが私の答えでどのように機能するかを以下に概説しました。 :) – TiM

答えて

2

Realmインスタンスはスレッドが限定されているため、作成されたスレッドでのみ動作します。スレッド間でインスタンスを試行して渡すと、間違ったスレッド例外が発生します。これは、RealmのACID準拠を保証する設計によって行われます。

特にシングルトンオブジェクトのRealmインスタンスへのハードリファレンスを保持することにはあまり意味がありません。特定のスレッドのRealmインスタンスが作成されると、Realmはその参照を内部的に保持し、同じ設定で新しいものを作成しようとすると、その参照を単に再供給します。その結果、Realm()を複数回呼び出す際のオーバーヘッドはほとんどありません。

デフォルトのレルムとは異なる構成でRealmインスタンスを使用する必要がある場合は、Configurationオブジェクトは、スレッドセーフであるので、あなたは、単にそれに単一の参照を格納し、そしてあなたがそれを必要なときRealm()にそれを渡すことができます。この場合

class RealmBackend { 

    static let shared = RealmBackend() 

    // A Configuration for a Realm in the caches directory 
    let cacheConfiguration = Realm.Configuration(
        fileURL: URL(fileURLWithPath: /* Path to the Realm in Caches */), 
        readOnly: true) 

    func addObject() { 
     let cacheRealm = try! Realm(configuration: cacheConfiguration) 
     // ... add object to cacheRealm 
    } 

    func getObject() -> Object { 
     let cacheRealm = try! Realm(configuration: cacheConfiguration) 
     let object = realm.objects(Object.self).first 
     return object 
    } 
} 
Realm

シングルトン方法が別のスレッドで呼び出されている場合でも、オンデマンドで作成されているので、レルム内部で正しいインスタンスを提供することができるであろう。

+0

とても助かりました、ありがとう! – phipsG

+0

私の喜び!お役に立てて嬉しいです! :) – TiM

+0

私はこのキャッシュ構成を使用していませんが、同じエラーが発生していますが、すべての関数でRealmを初期化しようとしています。 Realm() ' – phipsG

関連する問題