0

我有两个类形成一对多关系:

class FooA: Object {
    dynamic var someAValue: String

    let fooBList = List<FooB>()
}

class FooB: Object {
    dynamic var someBValue: String
}

我以这种方式将对象添加到 Realm 中:

let fooA = FooA()

fooA.someAValue = 'a value'

let fooB = FooB()

fooB.someBValue = 'a value'

fooA.fooBList.append(fooB)

let realm = try! Realm()

try! realm.write {
   realm.add(fooA)
}

一切顺利,对象被插入到 Realm 中。但是,当我尝试像这样访问 FooB 对象时:

fooA.fooBList[0]

它开始繁荣,应用程序崩溃!所以,很明显,我没有正确地将关系对象插入到 Realm 中,关系被破坏了。我在 Realm 文档中遗漏了什么?我必须先创建数组并以另一种方式将其添加到父对象吗?

要更新我的问题,这是想要炸毁的操作:

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 对象及其去向 BOOM。

4

1 回答 1

0

尝试这样的事情。它可能有一些错误。

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
}

}

于 2017-03-30T20:31:55.890 回答