将我的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 }
})
在事务开始时,它会抛出异常。为什么会发生这种情况,我该如何解决?
答案 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处理查询,现在一切都很好。