【问题标题】:the realm is already in a write transaction领域已经处于写入事务中
【发布时间】:2016-09-07 09:30:06
【问题描述】:

领域已处于写入事务中。

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

【问题讨论】:

    标签: objective-c transactions realm


    【解决方案1】:

    这是我在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 将检查是否有活动事务,并且将启动一个或仅执行传入的代码。

    【讨论】:

    • 我不知道为什么这不在标准领域库中。它是如此明显的包含。干得好!
    • 我可能很密集,但是 try block() 完成了什么?
    • Block 是你传递给方法执行的一段代码。所以,这在技术上是检查一个写块是否已经在进行中,如果是,那么你传入的代码将在那个写过程中执行,如果没有,那么它将打开一个新的写并执行你传递的代码。
    • 如果代码使用现有的写事务,是否保证完成?,
    • @gregm 在这两种情况下,sn-p 都会执行“块”——您在闭包中定义的代码。在一种情况下,它被直接调用,而在另一种情况下,它被传递给“write”,后者在内部启动写入事务,执行“块”,然后完成事务。在执行“块”时,基本上两种情况下的流程都保持不变,并且“块”将在您的代码完成后立即完成。希望能澄清一下并回答您的问题。
    【解决方案2】:

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

    如果您的实现中存在未正确设置的内容,则您假设已完成的事务也可能出现错误并处于打开状态。正如 Sebastian 所说,您可以使用 -[RLMRealm inWriteTransaction] 进行检查,但在这种情况下,您绝对应该回溯您的代码,看看为什么会发生这种情况。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-29
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        相关资源
        最近更新 更多