2016-07-26 5 views
1

をverify_thread。 我々は[PrinterRepository getDefaultPrinter]でレルムは、我々は以下のクラッシュ</p> <pre><code>realm::Realm::verify_thread() const (shared_realm.cpp:274) </code></pre> <p>それは散発的発生したが、我々のコードで異なるフローからのを経験しているクラッシュ

0x00000001003af7ec realm::Realm::verify_thread() const (shared_realm.cpp:274) 
0x0000000100339d78 RLMGetObjects (RLMObjectStore.mm:83) 
0x0000000100330130 +[RLMObject objectsWithPredicate:] (RLMObject.mm:150) 
0x00000001000fa468 -[PrinterRepository getDefaultPrinter] (PrinterRepository.m:35) 
0x00000001001faf3c -[PrintService handlePrintJobs] (PrintService.m:106) 

私たちのコードです見つけるスタックトレースの一つにローカル我々はまだこれを再現することができません

return [[Printer objectsWithPredicate:[NSPredicate predicateWithFormat:@"isDefault == 1"]] firstObject]; 

で、私たちは、これだけの時間から起こる見てきましたベータテスターと時間を合わせる。

当社のレルムバージョンは0.102.1

当社のiOSバージョンは9.2.1ですが、9.3.2 & 9.3.3

は、誰かがこのクラッシュの原因のアイデアを持っていますか?

答えて

0

管理対象レルムオブジェクトはスレッド制限されています。スレッド間で任意にそれらを渡すことは許されません。メインスレッド上のオブジェクトを取得する際には、そのスレッドのみを使用することができます。それをバックグラウンドスレッドに渡したいときは、メインスレッド上で識別子、理想的にはprimaryKeyと指定されたプロパティを取得し、それをバックグラウンドスレッドに渡す必要があります。

これに違反したときはいつも、そのような失敗があります。

当社the relevant chapter of our docs about "Passing Instances Across Threads"参照してください:RLMObjectsの

管理されていないインスタンスは、通常のNSObjectのサブクラスとして正確に動作し、それらのスレッドを通過しても安全です。

RLMRealm、RLMResults、またはRLMArrayのインスタンス、またはRLMObjectの管理対象インスタンスは、作成されたスレッドでのみ使用できます。それ以外の場合は例外がスローされます*。これは、Realmがトランザクションバージョンの分離を強制する1つの方法です。そうでなければ、潜在的に広範囲な関係グラフを持たずに、異なるトランザクションバージョンのスレッド間でオブジェクトが渡されたときに、何をすべきかを決定することは不可能である。

代わりに、スレッド間で安全に渡すことができる方法でインスタンスを表現するいくつかの方法があります。たとえば、主キーを持つオブジェクトは、主キーの値で表すことができます。 RLMResultsはNSPredicateまたはクエリ文字列で表すことができます。またはRLMRealmはRLMRealmConfigurationによって表すことができます。ターゲットスレッドは、そのスレッドセーフな表現を使用して、RLMRealm、RLMObject、RLMResults、またはRLMArrayを再フェッチすることができます。再フェッチでは、元のスレッドと異なる可能性があるターゲットスレッドのバージョンでインスタンスが取得されることに注意してください。

+1

回答ありがとうございますが、わたしにとって間違っていることは100%明らかではありません。この問題が発生した場合、 'objectsWithPredicate'または 'allObjects'を呼び出しています。結果が返される前にクラッシュが発生するため、結果のオブジェクトを別のスレッドに渡すことはありません。あるいはスタックトレースを間違って解釈していますか? – areander

関連する問題