2017-09-18 40 views
1

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

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

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

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

太好了,正是我在找的东西。谢谢! –