领域已经在写入事务中

时间:2016-09-07 09:30:07

标签: objective-c transactions realm

领域已经在写入事务中。

如何避免此错误?有没有办法检查领域的写入牵引力?如果领域处于写入事务中,则先关闭然后再执行其他工作。现在在收到此错误后“领域已经处于写入事务中”。那么与领域相关的其他任务也无法正常工作。

3 个答案:

答案 0 :(得分:4)

Realm的经验法则是在任何给定时间只在RLMRealm上打开一个写事务。如果您遇到此错误,可能需要重新考虑您的逻辑。您不应该故意尝试在同一个线程上已经打开的RLMRealm上打开第二个写入事务。在单独的线程上执行它很好,但第二个写入事务所在的线程将被阻塞,直到第一个完成。

如果您的实施中的某些内容未能正确设置,那么您认为已完成的交易也可能出现错误并且保持打开状态。就像塞巴斯蒂安所说,你可以用-[RLMRealm inWriteTransaction]来检查,但在这种情况下,你肯定应该回溯你的代码,看看为什么会发生这种情况。

答案 1 :(得分:2)

如果您在同一个线程中执行某些写入任务,可以将它们添加到NSMutableArray,然后使用addOrUpdateObjectsFromArray。另一方面,您可以通过在领域对象上触发inWriteTransaction来检查以避免写入冲突。

答案 2 :(得分:2)

这是我在this github discussion中遇到的一种可能的解决方案:

extension Realm {
    public func safeWrite(_ block: (() throws -> Void)) throws {
        if isInWriteTransaction {
            try block()
        } else {
            try write(block)
        }
    }
}

像这样使用它:

try! realm.safeWrite{
    //your write code goes here
}

现在safeWrite将检查是否有活动的事务,并且将启动一个事务或仅执行传入的代码。