我如何使Rx主体对添加到数组中的新元素做出反应?

问题描述 投票:1回答:1

我希望我的subjectobservemyArray上更改,因此每次向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

ios swift observable rx-swift
1个回答
0
投票

这是利用属性包装器的好时机。请注意,不要在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")
}
© www.soinside.com 2019 - 2024. All rights reserved.