“在写入事务中无法创建异步查询”异常

时间:2017-01-12 12:39:53

标签: macos swift3 realm

将我的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 }
})

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

尝试这样的事情:

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 }
})

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

答案 2 :(得分:0)

我认为您只需要将查询移动到事务中。

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 }
})

答案 3 :(得分:0)

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

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