【问题标题】:"Cannot create asynchronous query while in a write transaction" exception“在写事务中无法创建异步查询”异常
【发布时间】:2017-01-12 12:39:53
【问题描述】:

在将我的 OS X 应用程序从 swift 2.2 迁移到 swift 3.0(领域版本也从 1.0.2 更改为 2.1.1)后,一些写入事务开始抛出异常:“在写入事务中无法创建异步查询”。但在迁移之前它运行良好。

let realm = try Realm()
let allMessages = realm.objects(Message.self)
let messages = allMessages.filter("(state == 1) AND (dateSent <= %@)",  dateSent)
try realm.write ({
   messages.forEach { message in message.state = .seen }
})

在事务开始时它会抛出异常。为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 请尝试将查询移动到事务中

标签: macos swift3 realm


【解决方案1】:

在我的代码中遇到了同样的问题,结果发现开始写事务正在触发一个集合通知,该通知又创建了一个新的 RLMResults 并向其添加了一个通知块,这意味着我在写入事务中调用 addNotificationBlock 并崩溃了。

如果您可以重现,请在引发异常的results.cpp - void Results::prepare_async() 中放置一个断点,然后查看您的代码尝试执行的操作。

【讨论】:

    【解决方案2】:

    您似乎在forEach 中对messages 进行了变异,这可能是导致崩溃的原因。

    试试这样的:

    let realm = try Realm()
    let allMessages = realm.objects(Message.self)
    let results = allMessages.filter("(state == 1) AND (dateSent <= %@)",  dateSent)
    let messages = Array(results)
    try realm.write ({
       messages.forEach { message in message.state = .seen }
    })
    

    这可能不是最好的解决方案,因为您会将所有消息加载到内存中,但应该可以。

    【讨论】:

      【解决方案3】:

      我认为您只需将查询移到事务中即可。

      let realm = try Realm()
      try realm.write ({
           let allMessages = realm.objects(Message.self)
           let messages = allMessages.filter("(state == 1) AND (dateSent <= %@)",  dateSent)
           messages.forEach { message in message.state = .seen }
      })
      

      【讨论】:

        【解决方案4】:

        如果您在更改侦听器中执行 findAllAsync,则可能会发生这种情况 https://github.com/realm/realm-java/issues/5771#issuecomment-442004078

        我已经使用 async/await 处理了查询,现在一切都很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 2011-05-11
          • 1970-01-01
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多