假设我有一个这样的 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/