realm::IncorrectThreadException:从错误线程访问的领域(使用ReactiveSwift)
我有一个视图模型,它从我的API中获取一些数据,当我获取数据时,我将在领域和视图模型上的两个可变属性上设置它realm::IncorrectThreadException:从错误线程访问的领域(使用ReactiveSwift),swift,realm,reactive-swift,Swift,Realm,Reactive Swift,我有一个视图模型,它从我的API中获取一些数据,当我获取数据时,我将在领域和视图模型上的两个可变属性上设置它 userService.getBrowseData().on( failed: { error in // TODO: Should call a closure the VC passes in here with an error to show }, value: { banners,
userService.getBrowseData().on(
failed: { error in
// TODO: Should call a closure the VC passes in here with an error to show
}, value: { banners, lists in
browseStoreService.store(banners: banners, lists: lists)
self.banners.value = banners
self.lists.value = lists
}
).startWithCompleted { self.dataLoaded.value = true }
在我的视图控制器中,我在实例化和设置ListViewModel
disposable += viewModel?.dataLoaded.producer
.observe(on: UIScheduler())
.startWithValues { loaded in
if loaded {
guard let viewModel = self.viewModel else { return }
self.carousel?.reloadData()
for list in viewModel.lists.value {
let view = ListView()
view.viewModel = ListViewViewModel(list: list)
view.listViewDelegate = self
view.listItemViewDelegate = self
scrollingStackView.addArrangedSubview(view: view)
constrain(view) { view in
view.width == view.superview!.width
view.left == view.superview!.left
view.right == view.superview!.right
}
}
}
}
对我来说奇怪的是,我只是在领域中设置数据,我没有做任何额外的获取来获取领域外的数据,这会导致崩溃,特别是在写入尚未完成的情况下
在本例中,我从API的响应中获取了一个横幅数组
和一个列表数组
,将它们发送到我的storeService
中,将它们设置在领域中,并将这些相同的数组分配给它们各自的可变属性
知道是什么导致了这次事故吗
编辑:
store
函数如下所示:
func store(banners: [Banner], lists: [List]) {
let realm = try! Realm()
do {
try realm.write {
realm.add(banners, update: true)
realm.add(lists, update: true)
}
} catch {
return
}
realm.refresh()
}
两个模型都有一个主键
id
,我通过在主线程上进行领域写入找到了一个修复方法。不确定是否有更好的方法来解决这个问题,但这是一个解决方案即使只是读取属性,也无法跨线程访问领域对象。如果它在主线程上工作,则意味着您必须存储对最初在主线程上创建的领域对象的引用。您应该能够设置一个异常断点来跟踪导致异常的代码行,并查看哪个领域对象导致了问题。此外,如果您还没有使用它,那么可能值得检查RxRealm(),以便以这种方式将领域集成到反应式UI中。:)我使用的是ReactiveSwift,而不是RxSwift