gpt4 book ai didi

ios - 更改变量中的一个属性会触发对其他属性的订阅。接收 swift

转载 作者:IT王子 更新时间:2023-10-29 05:50:08 24 4
gpt4 key购买 nike

我有以下 Chat 属性结构

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

init() {}
}

在 View Controller 中,我声明了一个名为 observablechat 的 Chat 实例,然后我使用平面图运算符尝试并仅观察 date 属性的变化 可观察的聊天。但是,如果我更改性别属性(如图所示),则会触发订阅。我想知道为什么会这样,我该如何修复此代码,以便订阅只查看 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.
}
}

最佳答案

首先,为什么要flatMap

您只需要 distinctUntilChangedmapDebugPrint 只会被触发两次:初始设置 + 日期更改一次。查看下面的代码并随时提出问题。

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"

附言在 Playground 上运行 RxSwift 的方法:readme

关于ios - 更改变量中的一个属性会触发对其他属性的订阅。接收 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43697065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com