领域已经在写入事务中。
如何避免此错误?有没有办法检查领域的写入牵引力?如果领域处于写入事务中,则先关闭然后再执行其他工作。现在在收到此错误后“领域已经处于写入事务中”。那么与领域相关的其他任务也无法正常工作。
答案 0 :(得分:4)
Realm的经验法则是在任何给定时间只在RLMRealm
上打开一个写事务。如果您遇到此错误,可能需要重新考虑您的逻辑。您不应该故意尝试在同一个线程上已经打开的RLMRealm
上打开第二个写入事务。在单独的线程上执行它很好,但第二个写入事务所在的线程将被阻塞,直到第一个完成。
如果您的实施中的某些内容未能正确设置,那么您认为已完成的交易也可能出现错误并且保持打开状态。就像塞巴斯蒂安所说,你可以用-[RLMRealm inWriteTransaction]
来检查,但在这种情况下,你肯定应该回溯你的代码,看看为什么会发生这种情况。
答案 1 :(得分:2)
如果您在同一个线程中执行某些写入任务,可以将它们添加到NSMutableArray
,然后使用addOrUpdateObjectsFromArray
。另一方面,您可以通过在领域对象上触发inWriteTransaction
来检查以避免写入冲突。
答案 2 :(得分:2)
这是我在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
将检查是否有活动的事务,并且将启动一个事务或仅执行传入的代码。