如果Realm
处于写入事务中,我理解you can not register .observe
Realm
阻止对象或集合。
如果主线程上发生了所有事情,这会更容易管理但是我经常遇到这个异常,因为我更喜欢将我的JSON解析移到后台线程。这很有效,因为我不必陷入主线程,并且使用Realm
漂亮的通知系统,如果我已经注册以监听这些更改,我可以收到所有修改的通知。
现在,如果我要添加一个观察块,我会检查以确保我的Realm
不在这样的写入事务中:
guard let realm = try? Realm(), !realm.isInWriteTransaction else {
return
}
self.myToken = myRealmObject.observe({ [weak self] (change) in
//Do what ever
}
这成功防范了这个异常。但是,除非我有点创意,否则我永远不会有机会重新注册此令牌。
Realm
团队是否有关于更好模式的代码示例/建议以避免此异常?我没有成功注册令牌的任何技巧?
答案 0 :(得分:0)
除了标准功能外,我确实使用button: {
margin: 2,
borderRadius: 12,
borderWidth: 1,
backgroundColor: "transparent",
borderColor: "#d9b310",
align-self: 'flex-start'
},
的扩展名来避免这种情况。当我们的数据负载越来越大时,这个问题突然出现。
虽然我们现在重写了观察函数逻辑,但是此扩展是一种临时解决方案,可以避免崩溃。 想法很简单:当当前处于写事务中时,请重试。
Results
然后称呼它
import Foundation
import RealmSwift
extension Results {
public func safeObserve(on queue: DispatchQueue? = nil,
_ block: @escaping (RealmSwift.RealmCollectionChange<RealmSwift.Results<Element>>) -> Void)
-> RealmSwift.NotificationToken {
// If in Write transaction, call it again
if self.realm?.isInWriteTransaction ?? false {
DispatchQueue.global().sync {
Thread.sleep(forTimeInterval: 0.1) // Better to have some delay than a crash, hm?
}
return safeObserve(on: queue, block)
}
// Aight, we can proceed to call Realms Observe function
else {
return self.observe(on: queue, block)
}
}
}