Меня беспокоит, как управлять изменениями свойств объекта.
Имейте в виду, что ReactiveX - это функциональная парадигма. Свойства объектов не меняются. Скорее новый объект излучается из наблюдаемой с другими свойствами.
Если вас интересует только отслеживание названия конкретного автомобиля, тогда это простое сопоставление:
extension ObservableType where E == [Car] {
func nameOfCar(withID id: Int) -> Observable<String?> {
return map { $0.first(where: { $0.id == id }) }
.map { $0?.name }
.distinctUntilChanged()
}
}
Из-за оператора distinctUntilChanged()
приведенное выше значение будет выдавать значение только в случае изменения автомобиля с введенным именем. Опционально есть опция, так что потребитель может определить, нет ли автомобиля в массиве. С технической точки зрения, этот оператор наблюдает за потоком, который испускает массивы автомобилей, отображает карты каждого испускаемого массива, чтобы увидеть, существует ли автомобиль с правильным идентификатором, и, если это так, находит имя этого автомобиля. Затем он сравнивает это имя с предыдущим именем, которое он издает, и выдает имя только в том случае, если оно отличается.
Вы можете наблюдать за объектами автомобилей в целом с помощью:
extension ObservableType where E == Car {
var name: Observable<String> {
return map { $0.name }
.distinctUntilChanged()
}
var price: Observable<Double> {
return map { $0.price }
.distinctUntilChanged()
}
// etc...
}
extension ObservableType where E == [Car] {
func car(withID id: Int) -> Observable<Car?> {
return map { $0.first(where: { $0.id == id }) }
.distinctUntilChanged() // assumes a Car is Equatable
}
}
Я ожидаю, что с новой системой ключей Swift можно будет найти более общее решение.