2016-04-06 9 views
1

Я пытаюсь придумать простой наблюдаемый объект в Свифт и думал использовать RxSwift. Я не мог найти простой пример, чтобы сделать что-то вроде этого:Простая наблюдаемая структура с RxSwift?

protocol PropertyObservable { 
    typealias PropertyType 
    var propertyChanged: Event<(PropertyType, Any)> { get } 
} 

class Car: PropertyObservable { 
    typealias PropertyType = CarProperty 
    let propertyChanged = Event<(CarProperty, Any)>() 

    dynamic var miles: Int = 0 { 
    didSet { 
     propertyChanged.raise(.Miles, oldValue as Any) 
    } 
    } 

    dynamic var name: String = "Turbo" { 
    didSet { 
     propertyChanged.raise(.Name, oldValue as Any) 
    } 
    } 
} 

выше чисто Swift решения для наблюдаемых от this blog post; Мне очень нравится, как это решение на основе протокола, а не инвазивное. В моем случае у меня есть объект в моем проекте, где каждое свойство устанавливается асинхронно под капотом (устройство Bluetooth). Поэтому мне нужно наблюдать/подписываться на изменения, а не получать/устанавливать свойства в режиме реального времени.

Я продолжаю слышать, что RxSwift будет делать именно это и многое другое. Тем не менее, я не могу найти простой пример, чтобы соответствовать выше и начинаю думать, что RxSwift переполнен для моей потребности? Спасибо за любую помощь.

+0

Было бы, наверное, лучше, если вы выложили фактический код объекта из вашего проекта и показать, как вы устанавливаете его свойства. В поле RxSwift есть различные инструменты, которые могут быть применены к этой проблеме. –

ответ

3

Самый простой способ быстро сделать это наблюдаемым с RxSwift, вероятно, будет использовать класс RxSwift Variable (весь код здесь не тестировался с верхней части моей головы):

import RxSwift 

class Car { 

    var miles = Variable<Int>(0) 

    var name = Variable<String>("Turbo") 

} 

Это позволяет наблюдать значения подписавшись на них:

let disposeBag = DisposeBag() 
let car = Car 
car.name.asObservable() 
    .subscribeNext { name in print("Car name changed to \(name)") } 
    .addToDisposeBag(disposeBag) // Make sure the subscription disappears at some point. 

Теперь вы потеряли старую ценность в каждом случае. Есть конечно много способов решить эту проблему, так RxSwifty, вероятно, будет добавить scan operation to your element sequence, который работает много, как уменьшить делает на обычном массиве:

car.name.asObservable() 
    .scan(seed: ("", car.name.value)) { (lastEvent, newElement) in 
    let (_, oldElement) = lastEvent 
    return (oldElement, newElement) 
    } 
    .subscribeNext { (old, new) in print("Car name changed from \(old) to \(new)") } 
    .addToDisposeBag(disposeBag)