如何使用 ReactiveCocoa 正确发送具有初始值的信号?

How to properly send a Signal with an initial value using ReactiveCocoa?

我正在尝试将信号从一个 ViewModel 发送到另一个 ViewModel。基本上我希望第二个 ViewModel 使用与第一个 ViewModel 相同的信号,但我还需要第二个 ViewModel 中初始状态的初始值。到目前为止,我已经设法通过发送 Signal<Person, NoError>Person 模型来解决这个问题。

struct Person {
    let name: String
    let age: Int
}

PersonListViewModel 中,信号被定义为处理流的输出。

protocol PersonListViewModelOutputs {
     var goToPersonDetail: Signal<Person, NoError> { get }
}

PersonDetailViewModel:

protocol PersonDetailViewModelInputs {
    func viewDidLoad()
    func configureWith(personSignal: Signal<Person, NoError>, initialPerson: Person)
}

protocol PersonDetailViewModelOutputs {
    var person: Signal<Person, NoError> { get }
}

protocol PersonDetailViewModelType {
    var inputs: PersonDetailViewModelInputs { get }
    var outputs: PersonDetailViewModelOutputs { get }
}


public final class PersonDetailViewModel: PersonDetailViewModelType, PersonDetailViewModelInputs, PersonDetailViewModelOutputs {

    init(){
        self.person = self.configureWithPersonPropery.signal.skipNil()
    }

    private let configureWithPersonProperty = MutableProperty<Person?>(nil)
    func configureWith(personSignal: Signal<Person, NoError>, initialPerson: Person) {
        configureWithPersonProperty.value = initialPerson
        configureWithPersonProperty <~ personSignal.producer
    }
}

但是这个解决方案似乎在 func configureWith(...) 中引入了不必要的参数,我想可能有更好的方法来解决它。

例如,是否可以在不发送 Person 结构的情况下从 personSignal: Signal<Person, NoError> 中获取最后发出的值 func configureWith(...)

由于您的信号是 NoError,您可以只传入 Property 实例而不是 Signal。 属性 基本上是一个保证有值并且不能发送错误的信号。您可以创建一个具有初始值和现有信号的信号:

let prop = Property(initial: initialPerson, then: signal)