代码之家  ›  专栏  ›  技术社区  ›  vortek

结果如何。第一盖特

  •  0
  • vortek  · 技术社区  · 6 年前

    领域5.0.2

    我想知道这次坠机是怎么可能的。打电话时它正在崩溃 first 在一个领域 Results 对象我猜这是一个并发性问题,但Realm和query在同一个线程上实例化,Realm对象会立即转换为app对象。但如果这不是并发问题,那么。。。什么

    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
    ...
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Chris Shaw    6 年前

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

    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 )感谢被包括在新版本中。