如何使用 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)
我正在尝试将信号从一个 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)