Как заставить субъект Rx реагировать на новые элементы, добавленные в массив? - PullRequest
1 голос
/ 16 апреля 2020

Я бы хотел, чтобы мои subject в observe изменились на myArray, поэтому каждый раз, когда новый элемент добавляется к myArray, запускается subscription.

var subject = PublishSubject<[String]>()
var myArray = ["One", "Two"]

subject.flatMap{Observable.from($0)}.subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

subject.onNext(myArray)

myArray.append("Three")

subject.onNext(myArray)

работает, добавляя myArray к onNext при каждом изменении, но есть ли способ для subscription автоматически запускаться, когда myArray получает новый element без использования onNext? Возможно, превратив myArray в observable?

1 Ответ

0 голосов
/ 17 апреля 2020

Это прекрасное время, чтобы воспользоваться обёртками свойств. Будьте осторожны, чтобы не использовать это в struct.

@propertyWrapper
class RxPublished<Element> {
    private let subject: BehaviorSubject<Element>
    init(wrapped: Element) {
        subject = BehaviorSubject(value: wrapped)
    }

    deinit {
        subject.onCompleted()
    }

    var wrappedValue: Element {
        get { try! subject.value() }
        set { subject.onNext(newValue) }
    }

    var projectedValue: Observable<Element> {
        subject.asObservable()
    }
}


class MyClass {
    @RxPublished(wrapped: ["One", "Two"]) var myArray: [String]
}

func example() {
    let foo = MyClass()
    _ = foo.$myArray
        .debug("foo.myArray")
        .subscribe()

    foo.myArray.append("Three")
}
...