假设我有一个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
的范围例外。我认为这是因为我正在嵌套写作:创建文本然后更新它。
我如何优雅地做到这一点?
答案 0 :(得分:1)
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
}
}