Results.first.getter上的Realm崩溃



Realm 5.0.2

我正在努力了解这场车祸是怎么发生的。在RealmResults对象上调用first时崩溃。我猜这是一个并发问题,但Realm是在和查询相同的线程上实例化的,Realm对象会立即转换为应用程序对象。但如果这不是并发问题,那么。。。什么

0
Thread 1 Queue : com.apple.main-thread (serial)
#0  0x00000001037d8f7c in realm::IndexArray::index_string_all(realm::StringData, std::__1::vector<realm::ObjKey, std::__1::allocator<realm::ObjKey> >&, realm::ClusterColumn const&) const ()
#1  0x00000001036c8fdc in realm::IntegerNode<realm::ArrayIntNull, realm::Equal>::init() ()
#2  0x00000001036a740c in realm::Query::init() const ()
#3  0x00000001036a74dc in realm::Query::find_all(realm::ConstTableView&, unsigned long, unsigned long, unsigned long) const ()
#4  0x0000000103866e7c in realm::ConstTableView::do_sync() ()
#5  0x00000001036a78d0 in realm::Query::find_all(unsigned long, unsigned long, unsigned long) ()
#6  0x00000001036a7d50 in realm::Query::find_all(realm::DescriptorOrdering const&) ()
#7  0x00000001033af2c4 in realm::Results::do_evaluate_query_if_needed(bool) 
#8  0x00000001033aeca8 in realm::util::Optional<realm::Obj> realm::Results::try_get<realm::Obj>(unsigned long) 
#9  0x00000001033af01c in realm::util::Optional<realm::Obj> realm::Results::first<realm::Obj>() 
#10 0x0000000103542b9c in _ZZN5realm7Results5firstI18RLMAccessorContextEEDaRT_ENKUlTyS4_E_clIPNS_3ObjEEES3_S4_ 
#11 0x0000000103541d38 in _ZN5realmL14switch_on_typeINS_3ObjEZNS_7Results5firstI18RLMAccessorContextEEDaRT_EUlTyS6_E_EES5_NS_12PropertyTypeEOT0_ 
#12 0x00000001035418c0 in _ZNK5realm7Results8dispatchIZNS0_5firstI18RLMAccessorContextEEDaRT_EUlTyS5_E_EES4_OS5_ 
#13 0x0000000103541870 in auto realm::Results::first<RLMAccessorContext>(RLMAccessorContext&) 
#14 0x0000000103541834 in -[RLMResults firstObject]::$_8::operator()() const 
#15 0x000000010353d5c4 in auto translateRLMResultsErrors<-[RLMResults firstObject]::$_8>(-[RLMResults firstObject]::$_8&&, NSString*) 
#16 0x000000010353d544 in -[RLMResults firstObject] 
#17 0x0000000104968cf4 in Results.first.getter 
#18 0x000000010228e97c in static LibraryManager.LibraryPersistence.findPersistentTag(permanentId:temporaryId:) 
#19 0x000000010228e500 in LibraryManager.getTag(forAssignment:) 
#20 0x000000010220c284 in closure #1 in AudiobookUserSettings.tags.getter 
#21 0x000000019eb5e038 in Sequence.compactMap<A>(_:) ()
#22 0x000000010220c1d0 in AudiobookUserSettings.tags.getter 
#23 0x0000000102195e70 in Audiobook.tags.getter 
#24 0x000000010226407c in FolderManager.updateFromLibrary() 
#25 0x00000001022ca78c in LibraryTableViewController.refreshFolders() 
#26 0x00000001022c6930 in closure #1 in LibraryTableViewController.refreshView() 
#27 0x0000000102150700 in thunk for @escaping @callee_guaranteed () -> () ()
#28 0x0000000104b7605c in _dispatch_call_block_and_release ()
#29 0x0000000104b774d8 in _dispatch_client_callout ()
#30 0x0000000104b85f64 in _dispatch_main_queue_callback_4CF ()
#31 0x00000001911cc8d4 in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ ()
#32 0x00000001911c758c in __CFRunLoopRun ()
#33 0x00000001911c6bc8 in CFRunLoopRunSpecific ()
#34 0x000000019b5a85cc in GSEventRunModal ()
#35 0x0000000195379744 in UIApplicationMain ()
#36 0x00000001023d838c in main 
#37 0x0000000191043384 in start ()
Enqueued from audiobookSettings-persistence (Thread 33) Queue
#0  0x0000000104b7bdd0 in dispatch_async ()
#1  0x00000001c807004c in OS_dispatch_queue.async(group:qos:flags:execute:) ()
#2  0x00000001022c6808 in LibraryTableViewController.refreshView() 
#3  0x00000001022c6288 in closure #1 in LibraryTableViewController.viewWillAppear(_:) 

应用程序中的相关代码:

func getTag(forAssignment assignment: TagAssignment) -> Tag? {
let tag = LibraryPersistence.findPersistentTag(permanentId: assignment.permanentTagId,
temporaryId: assignment.temporaryTagId)
return tag?.toTag()
}
static func findPersistentTag(permanentId: Int? = nil, temporaryId: String? = nil) -> PersistentTag? {
guard let userId = getIdForCurrentUser() else {
return nil
}
let realm = try! Realm()
// First try lookup by permanent tag id
if let permanentId = permanentId {
let permanentIdNumber = NSNumber(value: permanentId)                
if let stored = realm.objects(PersistentTag.self).filter("permanentId == %@ AND userId == %@", permanentIdNumber, userId).first {
return stored
}
}
// Then try temporary tag id
if let temporaryId = temporaryId {
return realm.objects(PersistentTag.self).filter("temporaryId == %@ AND userId == %@", temporaryId, userId).first
}
return nil
}

更新:更多崩溃详细信息:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
#0: 0x0000000103bfc2fd Realm`realm::util::EncryptedFileMapping::read_barrier(void const*, unsigned long, unsigned long (*)(char const*)) + 29
* frame #1: 0x00000001035ce000 Realm`realm::util::do_encryption_read_barrier(addr=0x00007fff87a95540, size=8, header_to_size=(Realm`realm::NodeHeader::get_byte_size_from_header(char const*) at node_header.hpp:201), mapping=0xca4c51df08c18be5)(char const*), realm::util::EncryptedFileMapping*) at file_mapper.hpp:133:14
#2: 0x0000000103b496ee Realm`realm::IndexArray::index_string_all(realm::StringData, std::__1::vector<realm::ObjKey, std::__1::allocator<realm::ObjKey> >&, realm::ClusterColumn const&) const + 398
...

看起来你不是唯一一个有这个问题的人。

https://github.com/realm/realm-cocoa/issues/6556

这看起来像是5.0.x的问题,有些已经降级到4.x以消除问题。它引用了另一个问题(报告底部(,该问题已修复并合并,但尚未发布。

我会阅读错误报告,看看这是否符合你的经验,然后(a(遵循变通方法,或者(b(降级到4.4.x。注意修复问题(https://github.com/realm/realm-core/pull/3828)用于包含在新版本中。

最新更新