更改变量中的一个属性会触发其他属性的子目录.RxSwift

Rya*_*yan 8 system.reactive ios rxjs swift rx-swift

我有以下属性结构 Chat

struct Chat {
    var id = String()
    var gender = String()
    var date = Date()

    init() {}
}
Run Code Online (Sandbox Code Playgroud)

在视图控制器中,我声明了一个名为Chat的实例observablechat,然后我使用flatmap运算符来尝试并观察date属性的变化observablechat.但是,如果我更改性别属性(如图所示),则会触发订阅.我想知道为什么会这样,我如何修复此代码,以便订阅只查看date属性发生了什么,没有别的?

class ViewController: UIViewController {

    var observablechat = Variable(Chat())

        observablechat.asObservable()
        .flatMap { (Chat) -> Observable<Date> in
            return Observable.of(Chat.matchDate)
        }.subscribe(onNext: { (r) in
            print(r)
        }).addDisposableTo(disposeBag)


        self.observablechat.value.gender = "male" 
        //triggers subscription above. 
    }
}
Run Code Online (Sandbox Code Playgroud)

iWh*_*Buy 9

首先,为什么flatMap

你只需要distinctUntilChangedmap.DebugPrint将仅触发两次:初始设置+日期更改一次.查看下面的代码,随时提出问题.

import PlaygroundSupport
import RxSwift

struct Chat {

    var id: String
    var gender: String
    var date: Date

    init(id: String = "", gender: String = "", date: Date = Date(timeIntervalSince1970: 0)) {
        self.id = id
        self.gender = gender
        self.date = date
    }
}

final class YourClass {

    lazy var variableChat: Variable<Chat> = Variable<Chat>(Chat())

    var observableDate: Observable<Date> {
        return variableChat
            .asObservable()
            .distinctUntilChanged({ (chatOld, chatNew) -> Bool in
                return chatOld.date == chatNew.date
            })
            .map({ (chat) -> Date in
                return chat.date
            })
            .shareReplay(1)
    }
}

let value = YourClass()
value.observableDate
    .subscribe(onNext: { (date) in
        debugPrint(date.timeIntervalSince1970)
    })
value.variableChat.value.gender = "male"
value.variableChat.value.date = Date()
value.variableChat.value.gender = "female"
value.variableChat.value.gender = "male"
value.variableChat.value.gender = "female"
Run Code Online (Sandbox Code Playgroud)

PS在操场上运行RxSwift的方式:自述文件

  • 会做!我注意到添加你不熟悉的rx代码就像玩火.是时候阅读文档了.谢谢你的时间和解决方案的人! (2认同)