【问题标题】:Realm and RxSwift: A field change listener updating a field in the same object failsRealm 和 RxSwift:更新同一对象中的字段的字段更改侦听器失败
【发布时间】: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 异常而失败。

这只是一种不恰当的使用模式(让字段更改侦听器更新同一实体)还是发生了其他事情?谢谢。

【问题讨论】:

    标签: ios swift realm rx-swift


    【解决方案1】:

    这是一个不恰当的模式。 “A 的变化导致 A 的变化”本质上是循环的,您希望争取单向数据流。

    你在你的问题中说“当我检测到实体 A 中的一个非特殊字段发生变化时......”这就提出了一个问题,是什么改变了非特殊字段,而当它改变了非特殊字段时特殊领域,为什么它没有做出其他必要的改变?

    更改 A 中的任何特定字段都有特定的原因。对于每个字段,您应该概述这些原因是什么,并且他们应该进行更改。

    【讨论】:

    • 谢谢。 you want to strive for a unidirectional data flow-- 这是通用推理还是更具体地与 Realm 或 Rx 有关?我在第二部分点头。我就是这样解决这个问题的。
    • 更具体地说,很高兴知道 Realm/RxSwift 在 A 中的更改导致 A 更改与 A 中的更改导致 B 更改之间在技术上有何不同?我不是在这里问风格问题或通用软件工程问题。虽然我可以避免这种模式,因为它是一种不合适的模式,但我仍然想知道为什么这种模式会失败。
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多