具有Swift和Realm的单向数据流的对象视图状态

时间:2016-02-19 13:48:24

标签: ios swift realm

我正在使用Swift with Realm来构建单向数据流App。 我想知道为什么我不能将对象用作当前的应用程序状态。 添加新人时始终会更新var people,但var oldestPerson永远不会更新。 这是我的Store.swift文件

class Person: Object {
    dynamic var name: String = ""
    dynamic var age: Int = 0
}
// MARK: Application/View state
extension Realm {
    var people: Results<Person> {
        return objects(Person).sorted("age")
    }
    var oldestPerson: Person? {
        return objects(Person).sorted("age").first
    }
}
// MARK: Actions
extension Realm {
    func addPerson(name: String, age: Int) {
        do {
            try write {
                let person = Person()
                person.name = name
                person.age = age
                add(person)
            }
        } catch {
            print("Add Person action failed: \(error)")
        }
    }
}
let store = try! Realm()

我视图图层中oldest的状态永远不会改变,但people会发生变化。

import RealmSwift

class PersonsTableViewController: UITableViewController {

    var notificationToken: NotificationToken?
    var people = store.people
    var oldest = store.oldestPerson

    override func viewDidLoad() {
        super.viewDidLoad()
        updateView()
        notificationToken = store.addNotificationBlock { [weak self] (_) in
            self?.updateView()
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return people.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("PersonTableViewCell") as! PersonTableViewCell
        cell.person = people[indexPath.row]
        return cell
    }

    func updateView() {
        print(oldest)
        tableView.reloadData()
    }
}

1 个答案:

答案 0 :(得分:1)

更改

的声明
var oldest = store.oldestPerson

为:

var oldest: Person? { return store.oldestPerson }