斯威夫特的境界 - 创造关系

时间:2017-03-30 19:42:04

标签: ios swift realm realm-list

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

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]

这是BOOM,应用程序崩溃了!因此,显然,我没有正确地将关系对象插入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的位置。

1 个答案:

答案 0 :(得分: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
}

}