2016-07-26 91 views
1

我们正在经历以下崩溃境界verify_thread崩溃

realm::Realm::verify_thread() const (shared_realm.cpp:274) 

它发生零星的,但在我们的代码不同的流。 一个我们发现踪迹的是

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) 

我们在[PrinterRepository getDefaultPrinter]代码

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

本地,我们无法重现这个呢,我们只看到从这个时间发生与我们的beta测试人员合作。

我们的境界版本0.102.1

我们的iOS版本是9.2.1,9.3.2 & 9.3.3

是否有人有这个事故的原因的想法?

回答

0

受管领域对象受线程限制。线程之间不允许任意传递它们。当你在主线程上检索一个对象时,你只能在那里使用它。当你想将它传递给后台线程时,你需要在主线程上检索一个标识符,最好是指定为0​​的属性,并将其传递给后台线程。

只要违反这个规定,你就会失败。

见我们the relevant chapter of our docs about "Passing Instances Across Threads"

RLMObjects的非托管的情况下表现得完全作为常规NSObject的子类,并且是安全的跨线程传递。

RLMRealm,RLMResults或RLMArray的实例或RLMObject的托管实例只能在创建它们的线程上使用,否则会引发异常*。这是Realm强制执行事务版本隔离的一种方式。否则,如果没有可能广泛的关系图,在不同事务版本的线程之间传递对象时,将无法确定应该做什么。

相反,有几种方法可以用线程之间可以安全传递的方式表示实例。例如,具有主键的对象可以用其主键的值表示;或者RLMResults可以由其NSPredicate或查询字符串表示;或者RLMRealm可以由其RLMRealmConfiguration来表示。目标线程可以使用其线程安全表示重新获取RLMRealm,RLMObject,RLMResults或RLMArray。请记住,重新获取会在目标线程的版本中检索实例,这可能与原始线程不同。

+1

感谢您的答案,但它不是100%清楚我对自己做错了什么。发生此问题时,我们正在调用'objectsWithPredicate'或'allObjects'。我们没有将结果对象传递给另一个线程,因为崩溃发生在返回结果之前。或者我们解释堆栈跟踪是否错误? – areander