Ios 论快速创造关系
我有两个类,它们形成一对多的关系:Ios 论快速创造关系,ios,swift,realm,realm-list,Ios,Swift,Realm,Realm List,我有两个类,它们形成一对多的关系: class FooA: Object { dynamic var someAValue: String let fooBList = List<FooB>() } class FooB: Object { dynamic var someBValue: String } 一切顺利,对象被插入到领域中。但是,当我尝试像这样访问FooB对象时: fooA.fooBList[0] 它会轰隆一声,应用程序会崩溃!因此,很明显
class FooA: Object {
dynamic var someAValue: String
let fooBList = List<FooB>()
}
class FooB: Object {
dynamic var someBValue: String
}
一切顺利,对象被插入到领域中。但是,当我尝试像这样访问FooB对象时:
fooA.fooBList[0]
它会轰隆一声,应用程序会崩溃!因此,很明显,我没有将关系对象正确地插入到领域中,并且关系已损坏。我在领域文档中遗漏了什么?我必须先创建数组,然后以另一种方式将其添加到父对象中吗
更新我的问题,这是一个想要爆炸的行动:
FooApiClient.getFooAObjects()
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .default))
.observeOn(MainScheduler.instance)
.subscribe { [weak self] in
switch $0 {
case .next(let fooAObjects):
self?.fooAObjects = fooAObjects
case .completed:
self?.fooTableView.reloadData()
loadingView?.hide()
case .error(let error):
loadingView?.hide()
self?.handleError(error)
self?.showNoFooView()
}
}
.addDisposableTo(disposeBag)
调用:self?.fooTableView.reloadData()会导致表视图尝试显示检索到的foo对象及其位置。尝试类似的操作。它可能有一些错误
class SomeTableViewController: UITableViewController {
var fooA : FooA?
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
if let aFooA = realm.objects(FooA.self).first{
fooA = aFooA
self.reloadTableView()
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let _ = fooA{
return fooA!.fooBList.count
}
return 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SomeCell", for: indexPath)
// Configure the cell...
let fooB = fooA!.fooBList[indexPath.row]
cell.titleLabel.text = fooB.someBValue
return cell
}
}您可以发布您收到的错误吗?它会引发一个未捕获的错误,导致应用程序崩溃,没有给出“错误”或错误消息。您何时访问
fooA.fooBList[0]
?储蓄之后?您还可以下载领域是的,我从领域中检索所有对象,并在UITableViewDataSource.cellForRowAt中对它们进行迭代…领域文件中的数据以版本内部存储。写入事务创建反映该事务中所做修改的新版本。给定的Realm
实例公开Realm文件中单个版本的内容。在具有运行循环的线程(如主线程)上,只要将更改提交到领域文件,公开的版本就会自动更新为最新版本。在没有运行循环的线程上,Realm
实例必须通过Realm.refresh()
手动升级才能查看新数据。这也许可以解释为什么你看不到你期望看到的数据。所以,对于咧嘴笑和咯咯笑,我尝试在cellForRowAt中进行打印(fooA.someValue),我得到一个:libc++abi.dylib:终止于类型为realm::IncorrectThreadException:从错误线程访问的领域。使用我的代码?我现在在一个项目上有类似的代码,它可以工作。您应该在同一线程上访问您的领域对象。我使用RxSwift从服务中检索数据,将其插入领域,并将其交给ViewController显示。我如何确保它是正确的线程?我不知道RsSwift实际上是如何工作的,但可能服务器的响应是在后台线程上处理的?您是否创建了领域对象并将其推送到新的视图控制器?也许不是传递对象,而是传递PK并在新VC上获取对象。
class SomeTableViewController: UITableViewController {
var fooA : FooA?
override func viewDidLoad() {
super.viewDidLoad()
let realm = try! Realm()
if let aFooA = realm.objects(FooA.self).first{
fooA = aFooA
self.reloadTableView()
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let _ = fooA{
return fooA!.fooBList.count
}
return 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SomeCell", for: indexPath)
// Configure the cell...
let fooB = fooA!.fooBList[indexPath.row]
cell.titleLabel.text = fooB.someBValue
return cell
}