我正在尝试从一个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?
答案 0 :(得分:1)
由于您的信号为NoError
,因此您只需传入Property
个实例而不是Signal
。属性基本上是一个保证具有值并且不能发送错误的信号。您可以使用初始值和现有信号创建一个:
let prop = Property(initial: initialPerson, then: signal)