0

我正在使用RealmSwiftwith AsyncDisplayKit,我一直从以下位置收到此错误ASDataController.mm

libc++abi.dylib: terminating with uncaught exception of type realm::IncorrectThreadException: Realm accessed from incorrect thread.  

我有一个DataSourceManager包含数据的类和一个DatabaseManager处理fetchandinsert操作的类。

异常总是发生在_layoutNodesFromContexts:ofKind:completion:. 我已经尝试过任何我知道的 GCD 组合(串行、并发、屏障),但我无法处理这个异常。

我应该如何处理这种情况?

谢谢!

4

3 回答 3

0

这可能是因为AsyncDisplayKit(或Texture现在)在多个后台线程上工作,并且您的领域对象正在线程之间传递。这就是为什么IncorrectThreadException.

要在线程之间传递您的领域对象,请使用ThreadSafeReference, 以及使用realm.resolve您在 AsyncDisplayKit 中访问对象的位置。

更多信息在这里。

于 2017-10-14T19:27:38.973 回答
0

我已尝试将 Unmanaged_RLMObject 作为解决方法。Unmanaged_RLMObject 是未添加到 RLMRealm 的 RLMObject。

它有效,但我认为这不是一个好的解决方案。

RLMObjects 的非托管实例的行为与常规 NSObject 子类完全相同,并且可以安全地跨线程传递。

资源

于 2016-07-22T11:36:32.650 回答
0

我发现的快速简便的解决方案不是直接在layoutSpecThatFits后台调用的方法中访问您的数据模型,而是简单地从模型中声明一个所需的参数并将其设置在您的 init 方法中。然后layoutSpecThatFits像往常一样使用它。

例如:

假设您的数据模型是Person

class Person: Object {
@objc dynamic var name: String = ""
@objc dynamic var birthday: Date = Date()
}

在 layoutSpecThatFit 方法上的节点(CellNode、DisplayNode 等)中,不要直接访问人员,而是有一个属性说name您在方法中设置它init,然后像这样使用它:-

var name: String

init(person: Person){
// Set the property here so that you don't have to call person.name in layoutSpect method.
self.name = person.name 
super.init()
}

override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec {

// Now you can safely use the param here on a different thread without issues.
if (self.name) {
// ---
}

}

参考:我从这篇文章中找到了想法

于 2020-10-31T01:06:07.543 回答