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
}