如何返回领域对象或如果为空则创建一个?

时间:2016-07-21 02:40:14

标签: 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的范围例外。我认为这是因为我正在嵌套写作:创建文本然后更新它。

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

1 个答案:

答案 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
    }
}
相关问题