J'ai un client qui veut récupérer certaines données basées sur l'effort combiné de deux commandes. La raison pour laquelle j'ai besoin de deux commandes est que la deuxième commande repose sur les données de la première commande. Ma question est quelle est la meilleure façon de passer des données de la première commande à la deuxième commande? J'utilise un objet de coordination qui est un délégué de la première et deuxième commande - mais cela semble désordonné. Est-ce résolvable dans la couche où toutes les commandes sont logées ou a-t-elle besoin de cet objet de coordination?Comment transmettre des données entre des commandes séquentielles?
est ici une représentation de la classe client:
class ViewController: UIViewController, CoordinatorDelegate {
// ...
@IBAction func didTouchButton(sender: UIButton) {
self.coordinator.fetchSchoolID(firtName: "Jane", lastName: "Jones")
}
// MARK: - CoordinatorDelegate
func fetchSchoolIDSucceeded(ID ID: Int) {
self.updateUIWithSchoolID(ID)
}
func fetchSchoolIDFailed(error error: NSError) {
self.displayError(error)
}
}
L'objet coordinateur:
protocol CoordinatorDelegate {
func fetchSchoolIDSucceeded(ID ID: Int)
func fetchSchoolIDFailed(error error: NSError)
}
struct Coordinator: FetchSchoolInfoActionDelegate, FetchStudentInfoActionDelegate {
let actionFactory: ActionFactory
var delegate: CoordinatorDelegate?
func fetchSchoolID(firstName: String, lastName: String) {
let firstAction = self.actionFactory.fetchStudentInfoAction(firstName: firstName, lastName: lastName, delegate: self)
firstAction.execute()
}
// MARK: - FetchStudentInfoActionDelegate
func fetchStudentInfoSucceeded(studentInfo: StudentInfo) {
let secondAction = self.actionFactory.fetchShoolInfoAction(schoolName: studentInfo.schoolName, delegate: self)
secondAction.execute()
}
func fetchStudentInfoFailed(error: NSError) {
self.delegate?.fetchSchoolIDFailed(error: error)
}
// MARK: - FetchSchoolInfoActionDelegate
func fetchSchoolIDSucceeded(schoolInfo: SchoolInfo) {
self.delegate?.fetchSchoolIDSucceeded(ID: schoolInfo.ID)
}
func fetchSchoolIDFailed(error: NSError) {
self.delegate?.fetchSchoolIDFailed(error: error)
}
}
Sommairement, le client (ViewController
) veut récupérer le schoolID
donné un firstName
et lastName
d'un étudiant . Pour ce faire, deux commandes doivent être exécutées: FetchStudentInfoAction
et FetchSchoolInfoAction
. La deuxième commande dépend des données de la première commande - dans ce cas, FetchSchoolInfoAction
a besoin du schoolName
de l'élève qui est récupéré par le FetchStudentInfoAction
.
Cela semble désordonné. Si nous imaginons que plus de demandes sont ajoutées à ViewController
, l'objet Coordinator
deviendra de plus en plus complexe. Existe-t-il une meilleure façon de traiter un ensemble de commandes séquentielles lorsque la deuxième commande nécessite des données du premier? Pourrait-il être géré par un objet sur le calque de commande au lieu de Coordinator
?
ce que j'ai actuellement atterri sur la création est une nouvelle commande qui lui-même devient le délégué des deux commandements il est la coordination - et ayant l'objet que j'appelle actuellement 'l'aide Coordinator' juste cette nouvelle acti sur. –