Realm Swift-使用模式时对象未更新

时间:2018-12-21 16:44:39

标签: ios swift realm

工作代码

在tableView的didSelectRowAt IndexPath方法中,我有一个调用来更新UserSave模型,该模型位于默认领域。该函数的结构如下:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let UserRealm = UserSave()
    let realm = try! Realm()
    try! realm.write {
        UserRealm.articleLink = newsLink[indexPath.row]
        UserRealm.articleBody = newsData[indexPath.row]
        UserRealm.articleTitle = newsTitle[indexPath.row]
        UserRealm.articleAuthor = newsSrc[indexPath.row]
    }
    performSegue(withIdentifier: "webKitSegue", sender: self)
}

运行此命令时,领域将按照新值更新。

问题代码

我有第二个模型UserPrefs,它也是默认领域的一部分。它在内部函数exrefresh(writeToRealm: String)中被称为。该函数如下所示:

func exrefresh(passed: String) {
    let UserRealm = UserPrefs()
    let realm = try! Realm()
    try! realm.write {
        UserRealm.fetchUrl = passed
    }
    self.refreshControl!.beginRefreshing()
    self.refreshControl!.sendActions(for: .valueChanged)
}

但是,运行此功能时,领域将保留其默认值,并且不会使用新的更新。

模型

// UserSave

import RealmSwift

class UserSave: Object {
    @objc dynamic var articleTitle = "Default Title"
    @objc dynamic var articleAuthor = "Default Author"
    @objc dynamic var articleLink = "https://example.com"
    @objc dynamic var articleBody = "Default Body"
}

// UserPrefs

import RealmSwift

class UserPrefs: Object {
    @objc dynamic var applicationDark = false
    @objc dynamic var fetchUrl = "https://example.com/"
}

问题

尽管我无法更改UserPrefs中的值,即使它们都在默认领域中,我也可以更新UserSave模型。我使用相同的代码(替换了名称)来更新两个模型,只有一个能正常工作。我在Realm Browser中拉起了.realm文件,并且能够监视UserSave的更改。我遵循了realm.io中的指南,它们的代码仅适用于一种模型。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的问题提到默认值。假设对象已经存在,则需要获取该对象然后才能对其进行更新。否则,Realm不会知道您要指的是什么对象。

这是编写对象的代码。

func exrefresh(passed: String) {

    let UserRealm = UserPrefs()
    UserRealm.fetchUrl = passed

    let realm = try! Realm()
    try! realm.write {
        realm.add(UserRealm)
    }
}

如果您将只拥有一个该类型的对象,那么这里是更新它的代码。

    let realm = try! Realm()
    let results = realm.objects(UserPrefs.self)
    let theOnlyOne = results.first!

    try! realm.write {
        theOnlyOne.fetchUrl = passed
    }

这假设您已经进行了适当的错误检查,以知道它们在更新之前就存在。