2017-09-18 6 views
1

J'essaie d'envoyer un signal d'un ViewModel à un autre. Fondamentalement, je veux que le second ViewModel utilise le même signal que le premier ViewModel, mais j'ai aussi besoin de la valeur initiale à l'état init dans le second ViewModel. Jusqu'à présent, j'ai réussi à résoudre ce problème en envoyant le Signal<Person, NoError> et le modèle Person.Comment envoyer correctement un signal avec une valeur initiale en utilisant ReactiveCocoa?

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

Dans PersonListViewModel le signal est défini en tant que sortie où le courant est manipulé.

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 
    } 
} 

Cependant, cette solution semble apporter paramètre inutile à l'intérieur func configureWith(...) et je pense qu'il pourrait y avoir une meilleure façon de le résoudre.

Par exemple, est-il possible d'obtenir la dernière valeur émise de personSignal: Signal<Person, NoError> à l'intérieur de func configureWith(...) sans envoyer la structure de personne?

Répondre

1

Puisque votre signal est NoError, vous pouvez simplement passer dans une instance Property au lieu d'une Signal. Une propriété est essentiellement un signal dont la valeur est garantie et qui ne peut pas envoyer d'erreur. Vous pouvez en créer un avec une valeur initiale et un signal existant:

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

Super, exactement ce que je cherchais. Je vous remercie! –