【发布时间】:2019-08-19 18:48:55
【问题描述】:
我有办法解决这个问题,但想大致了解这是否只是 Realm 和 RxSwift 的一种不合适的模式,或者它是否反映了底层框架交互中的错误。这就是我正在做的事情。我已经在一个 Realm 实体上设置了一个更改侦听器(称为实体 A;这只是此类 Realm 对象的一个实例或记录)以查找更改,除了实体 A 中的一些特殊字段。我使用:
extension Observable where Element: Object {
/// Observe changes to object *except* for specific fields.
static func from(object: Element, emitInitialValue: Bool = true,
exceptForProperties: [String]) -> Observable<Element> {
return Observable<Element>.create { observer in
if emitInitialValue {
observer.onNext(object)
}
let token = object.observe { change in
switch change {
case .change(let changedProperties):
if changedProperties.contains(where: {
return exceptForProperties.contains($0.name)
}) {
// if change property is an excepted one, just return
return
}
observer.onNext(object)
case .deleted:
observer.onError(RxRealmError.objectDeleted)
case .error(let error):
observer.onError(error)
}
}
return Disposables.create {
token.invalidate()
}
}
}
}
当我检测到实体 A 中的一个非特殊字段发生变化时,我会更新实体 A 中的特殊字段(例如,这包括一个“脏”标志,表明我需要上传 Realm 实体)。
我发现当我遵循这个顺序时: 1)更改Realm实体A中的非特殊字段之一 2) 使用其他 Realm 实体,实体 B(不同类型的 Realm 对象)进行 Realm 写入 3) 在 2) 中 Realm 写入的确切位置,触发实体 A 的更改侦听器。并尝试执行另一个(嵌套)Realm 写入,这当然会因 Realm 异常而失败。
这只是一种不恰当的使用模式(让字段更改侦听器更新同一实体)还是发生了其他事情?谢谢。
【问题讨论】: