ios - 如果 Realm 对象为空,我如何返回或创建一个 Realm 对象?

标签 ios swift realm

假设我有一个这样的 SearchText 对象:

class SearchText: Object {
    dynamic var text: String = ""
}

我想创建一个访问器,这样我就可以获取该对象(如果它存在)或创建一个(如果它不存在)。这就是我的。

extension Realm {
    var searchText: SearchText {
        if let searchText = objects(SearchText.self).first {
            return searchText
        } else {
            let searchText = SearchText()
            try! write {
                add(searchText)
            }
            return searchText
        }
}

这有点管用,但这是我的问题。我想使用 searchText 并更新它的值。像这样的东西:

func updateSearchText(text: String) {
        try! write {
            searchText?.text = text
        }
    }

当我尝试updateSearchText 时,我得到了Realm is already in a write transaction Realm 异常。我认为这是因为我正在嵌套写入:创建文本然后更新它。

我该如何优雅地做到这一点?

最佳答案

Realm 目前不提供嵌套事务。有一种避免异常的方法是在打开事务之前检查您是否处于写入事务中。像下面这样:

func updateSearchText(text: String) {
    func update() {
        searchText?.text = text
    }

    if inWriteTransaction {
        update()
    } else {
        try! write {
            update()
        }
    }
}

也许 searchText setter 也应该是:

var searchText: SearchText {
    if let searchText = objects(SearchText.self).first {
        return searchText
    } else {
        let searchText = SearchText()
        if inWriteTransaction {
            add(searchText)
        } else {
            try! write {
                add(searchText)
            }
        }
        return searchText
    }
}

关于ios - 如果 Realm 对象为空,我如何返回或创建一个 Realm 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493982/

相关文章:

swift - Realm Swift 主键无法检索到正确的值

objective-c - sizeWithFont 在 UITextField 中返回错误的高度

ios - 多角色 iOS 应用程序 - 多个角色的逻辑应该在相同还是不同的 View Controller 中?

arrays - 如何将字典应用于数组以使其正确排序?

android - 将 protobuff 类转换为模型并使用 Realm 存储其值

android - `User` 不是该 Realm 架构的一部分 - 如何确定 'User' 是否存在?

android - Calabash 支持 iOS 和 Android 版本吗?

ios - 使用xcode 14.1时是否可以找到flutter ios构建ipa文件

ios - 如何使用 ARKit/swift ViewController 创建 React Native 组件?

ios - 使用 Swift 访问 Microsoft Face API IOS