【发布时间】:2016-09-07 09:30:06
【问题描述】:
领域已处于写入事务中。
我怎样才能避免这个错误?有没有办法检查领域是否在写入牵引力?如果领域处于写入事务中,则先关闭然后再做其他工作。现在收到此错误后,“领域已经处于写入事务中”。那么与领域相关的其他任务也无法正常工作。
【问题讨论】:
标签: objective-c transactions realm
领域已处于写入事务中。
我怎样才能避免这个错误?有没有办法检查领域是否在写入牵引力?如果领域处于写入事务中,则先关闭然后再做其他工作。现在收到此错误后,“领域已经处于写入事务中”。那么与领域相关的其他任务也无法正常工作。
【问题讨论】:
标签: objective-c transactions realm
这是我在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 将检查是否有活动事务,并且将启动一个或仅执行传入的代码。
【讨论】:
Realm 的经验法则是在任何给定时间在RLMRealm 上只打开一个写入事务。如果您遇到此错误,您可能需要重新考虑您的逻辑。您不应该故意尝试在已在同一线程上打开的RLMRealm 上打开第二个写入事务。在单独的线程上执行它很好,但是第二个写事务所在的线程将被阻塞,直到第一个完成。
如果您的实现中存在未正确设置的内容,则您假设已完成的事务也可能出现错误并处于打开状态。正如 Sebastian 所说,您可以使用 -[RLMRealm inWriteTransaction] 进行检查,但在这种情况下,您绝对应该回溯您的代码,看看为什么会发生这种情况。
【讨论】:
如果你在同一个线程中做一些写任务,你可以将它们添加到NSMutableArray,然后使用addOrUpdateObjectsFromArray。另一方面,您可以通过在领域对象上触发 inWriteTransaction 来检查以避免写入冲突。
【讨论】: