RXSwift,作为变量的结构体

Posted

技术标签:

【中文标题】RXSwift,作为变量的结构体【英文标题】:RXSwift, a Struct as a Variable 【发布时间】:2018-01-04 10:44:18 【问题描述】:

所以基本上我有一个结构

struct MyStruct 
    var foo : String = "" 
    var bar : String = ""

现在我想做以下事情: 观察 MyStruct 的 RxVariable 中的变化,这样每当该变量发生变化时,我们也有该变量的观察者,我们将能够在该观察者中获取新结构。

再次澄清 -

A 类

var stct : Variable<MyStruct>() // RxSwift variable

B 类:

 let observer = instanceClassA.stct.asObserver().subscribe(onNext : 
  (newStruct) in 
       // newStruct found here -
  
 observer.dispose(by:disposeBag)

我想要这个流程的原因是:我想让Class B 知道myStructClass A's 变量何时更改为新值,因为每次myStruct 变量更改时,foobar 将也变了

认为 B 类是 A 类变量 myStruct 的观察者。现在我正在学习 RxSwift,因此我想利用它的反应性方法。另外我认为这是一件相当容易的事情,但问题是我无法制作Variable (read : Rx)MyStruct

P.S - 我使用的是 Swift 4.0 和 RxSwift 的最新版本。

非常感谢任何帮助。

【问题讨论】:

是为 stct 变量分配了一个全新的 struct 实例,还是您只是修改了现有 stct 实例的 foo 和 bar 属性的值 可以两者兼有,根据一定的逻辑,是否可以从同一个api观察两种变化? 看看这个***.com/questions/36460542/… 您可以为 foo 和 bar 的值添加观察者,然后使用 scan 组合两个观察者并创建一个可以订阅的新 observable。因此,无论您更改 foo 还是 bar,您的订阅者都会被触发 :)。最后将 MyStruct 更改为 class 以通过分配 MyStruct 的新实例来观察更改 我已经看到了,但这反过来将结构内的变量作为可观察的,但我希望观察整个结构变量 【参考方案1】:

为什么不使用distinctUntilChanged 运算符?

您可以使您的结构符合EquatabledistinctUntilChanged 运算符将这样工作:

struct MyStruct: Equatable 

    var foo : String = ""
    var bar : String = ""

    static func ==(lhs: MyStruct, rhs: MyStruct) -> Bool 
        return lhs.bar == rhs.bar && lhs.foo == rhs.foo
    


func observableStctChangedByEquatable() -> Observable<MyStruct> 
    return stct
        .asObservable()
        .distinctUntilChanged()


let observer = instanceClassA
    .observableStctChangedByEquatable()
    .subscribe(onNext:  (newStruct) in
        //
    )

如果您不喜欢Equatable,还有其他一些方法可以使用distinctUntilChanged 运算符。选择你最喜欢的一个:

struct MyStruct 

    var foo : String = ""
    var bar : String = ""

    static func comparer(lhs: MyStruct, rhs: MyStruct) throws -> Bool 
        return lhs.bar == rhs.bar && lhs.foo == rhs.foo
    


func observableStctChangedByComparer() -> Observable<MyStruct> 
    return stct
        .asObservable()
        .distinctUntilChanged(MyStruct.comparer)


func observableStctChangedByBlock() -> Observable<MyStruct> 
    return stct
        .asObservable()
        .distinctUntilChanged( (lhs, rhs) -> Bool in
            return lhs.bar == rhs.bar && lhs.foo == rhs.foo
        )


func observableStctChangedWith(comparer: @escaping (MyStruct, MyStruct) throws -> Bool) -> Observable<MyStruct> 
    return stct
        .asObservable()
        .distinctUntilChanged(comparer)


let observer = instanceClassA
    .observableStctChangedWith(comparer:  (lhs, rhs) -> Bool in
        return lhs.bar == rhs.bar && lhs.foo == rhs.foo
    )
    .subscribe(onNext:  (newStruct) in
        //
    )

【讨论】:

以上是关于RXSwift,作为变量的结构体的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

怎么用结构体变量做函数参数

数据结构 -- 结构体Struct

结构体作为函数参数值传递的问题

20170908_郝斌C结构体

C语言 结构体作为函数的参数