该领域已经在写事务中

Aye*_*Aye 7 transactions objective-c realm

该领域已经在写事务中。

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

TiM*_*TiM 8

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

如果您的实现中存在某些设置不正确的内容,则您假设已完成的事务也可能存在错误并保持打开状态。就像塞巴斯蒂安说的,你可以用 来检查这个-[RLMRealm inWriteTransaction],但在这种情况下,你绝对应该回溯你的代码,看看为什么会发生这种情况。


vir*_* us 8

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

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

像这样使用它:

try! realm.safeWrite{
    //your write code goes here
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道为什么这不在标准领域库中。它是如此明显的包含。干得好! (4认同)