2017-06-29 149 views
0

我正在追踪在生产中发生的崩溃,其中调用indexOfResults引发Object type <my object type> does not match RLMResults type <my object type>。我在他们的github上发现了this issue,2015年的this PR已经解决了这个问题,这意味着我已经有了这个修复。有没有人从那以后有过体验,也许有不同的原因?`indexOf`正在投掷“对象类型与RLMResults不匹配”异常

我的情况与上面链接的问题发布者的情况类似 - 传递给indexOf的实例可能在此时不受领域管理。

编辑:我的代码看起来像

extension MyObject { 
    func refresh() { 
     let realm = try! Realm() 
     realm.refresh() 
     let results = realm.objects(MyObject.self) 
     .filter(/* some filtering... */) 
     .sorted(/* some sorting... */) 

     if let ownIndex = results.index(of: self) { 
     /* do something */ 
     } 
    } 
} 

的方法称为(从外地)领域中的每个对象上添加了新的对象后:在index(of:)

let realm = try! Realm() 
realm.refresh() 
try! realm.write { 
    // iterate over some data to populate new realm objects from 
    for objectData in data { 
     let object = MyObject() 
     object.populateFields(from: objectData) // Just sets some fields on the object 
     realm.add(object, update: true) 
    } 

    for object in realm.objects(MyObject.self).filter(/* Some filter... */) { 
     object.refresh() 
    } 
} 

的坠机事件发生。

+0

请张贴一些代码来显示您在什么情况下收到此错误。 –

+0

每次添加新对象时,必须更新Realm中对象的__all__似乎是一个不好的解决方案。你确定你不能用内置的链接对象来实现相同的功能吗?使用那些你会摆脱你的功能导致这个问题。 –

+0

(1)我不能,真的。我的具体情况是'refresh'更新持久聊天消息中名为'isFirstOfDay'和'isLastInGroup'的属性。这发生在添加或删除消息时,这可能会使任何现有对象上的这些属性无效。他们没有互相链接,所以不要认为这个链接适用。过滤器(我在我的例子中留空)非常积极,以确保不会发生不必要的更新。 (2)请解释如何做到这一点,如果我可以解决问题? –

回答

0

我最好的猜测是refresh()你的对象可以被删除,这意味着你试图获得扩展中的无效对象索引。

以前检查self.isInvalidated可能是一个好主意,否则如果您有复制案例,请在https://github.com/realm/realm-cocoa/issues处创建问题。