2017-07-10 3 views
0

ユーザーがログインする必要があるため、アプリがあります。ログイン中にデータがインターネットからダウンロードされ、Realmデータベースに作成されました。次のアプリケーション実行時に不正なスレッドからアクセスされたレルム

アプリが終了して再び開いた場合、再びログインする必要がないように、アプリがログインしているユーザーを保持するようにします。最初のユーザーログイン中はすべて正常です。アプリケーションが閉じられて再び開くと、「不正なスレッドからアクセスされました」というエラーがスローされます...

問題がどこにないか分かりません。私は、アプリをもう一度やり直すのが以前とは違うスレッドであるかどうかを知りたいですか?それが元のスレッドから作成されたデータに新しいスレッドでアクセスするには、エラーに遭遇することはありませんか?

あなたが遭遇してきたように任意の助けが...事前

答えて

2

に感謝を理解されるであろう、あなたはそれが開かれたスレッドと異なるスレッドからレルムにアクセスすることはできません。ただし、同じレルムの複数のインスタンスを別のスレッド(または必要に応じて同じスレッド)で開くことは可能です。レルムを開くことはコストのかかる操作ではないため、レルムを開く際のパフォーマンスの問題はありません。

あなたのケースでは、バックグラウンドスレッドでデータをダウンロードしていると思います。レルムがそのネットワーク要求のコールバックで最初に開かれていることも推測しています。つまり、コールバックがオンになっているスレッドでレルムが開かれます。アプリケーション(または以前と同じスレッドではない他のスレッド)を再度開くときにメインスレッドでその領域にアクセスしようとすると、エラーが発生します。

ベストプラクティスは、別のスレッドで作業していることを知るたびに新しいレルムを開くことです。私が言及したように、これは高価な操作ではないので、自由に使用する必要があります。

RealmServiceまたはRealmManagerのようなものがシングルトンとしてある場合は、それをお勧めします。レルムがメインスレッドで初期化されている場合は、バックグラウンドスレッドからレコードを追加することはできません。

要するに、コールバックでレルムに対して操作を行っているときは、レルムを開いたときと同じスレッドになることを100%保証していない限り、新しいレルムインスタンスを作成し、あなたの操作を行います。

+0

すばらしい説明!これはありがとう!しかし、我々はすでにエラーを把握しており、それがレルムにスローさせてエラーを発生させる論理エラーです。最初のログイン時に、Realmが管理していない静的オブジェクトを使用しています。自動ログインすると、データベースからフェッチしたデータがRealmオブジェクトとなり、そのオブジェクトの変更によってエラーがスローされます。レルムオブジェクトの「スタンドアロン」コピーを作成することで修正できます。 – SquareBox

関連する問題