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

时间:2017-09-18 15:53:38

标签: ios swift mvvm reactive-cocoa frp

我正在尝试从一个ViewModel向另一个ViewModel发送信号。基本上我希望第二个ViewModel使用与第一个ViewModel相同的Signal,但我还需要在第二个ViewModel中的init状态下的初始值。到目前为止,我已设法通过发送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(...)内部带来了不必要的参数,我想可能有更好的方法来解决它。

例如,是否可以在personSignal: Signal<Person, NoError>内从func configureWith(...)获取最后一次发射的值而不发送Person Struct?

1 个答案:

答案 0 :(得分:1)

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

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