Dient als Ausgangspunkt für den App Programmierer.
Soll ein Fragebogen (questionnaire, survey) angezeigt werden, wird ein FHIR Questionnaire
aus dem Internet oder aus lokalem File in ein FHIR Objekt geladen, via FHIR library.
Dann wird ein QuestionnaireController
mit Referenz auf dieses questionnaire instanziiert.
Dem Controller kann mitgeteilt werden, was nach erfolgter Questionnaire-Eingabe passieren soll.
Im iOS Framework gibt es dazu die zwei Blocks whenCompleted
und whenCancelledOrFailed
.
Die Hauptmethode im Controller ist prepareQuestionnaireViewController()
, mit dem Ziel dass nach asynchroner Ausführung entweder ein Fehler oder ein vorgefertigter TaskViewController
(aus ResearchKit/Stack) retourniert wird.
Diese Methode:
- Stellt sicher, dass der Controller ein FHIR Questionnaire hat
- Erstellt ein Promise für das Questionnaire
QuestionnairePromise
- Wartet darauf, dass die Promise erfüllt wird, welche bei Erfolg
- Ein
OrderedTask
(aus ResearchKit/Stack) retourniert - Mit dem Task wird ein
TaskViewController
(aus ResearchKit/Stack) erstellt
Dieser Task View Controller kann dem User nun angezeigt werden.
Sind alle Fragen beantwortet oder wird abgebrochen, wird der Controller vom Task View Controller informiert (da er sich als Delegate angemeldet hat) und kann dann entsprechend die whenCompleted
oder whenCancelledOrFailed
Blocks ausführen.
Dadurch ist der App-Programmierer informiert und der Kreis schliesst sich.
Wird für ein FHIR Questionnaire erstellt und kümmert sich darum, alle Fragen und Gruppen in jeweilige Step
(aus ResearchKit/Stack) umzuwandeln.
Dazu wird für die top level Gruppe – ab STU-3 das top level Item – in ein QuestionnaireXyPromise
umgewandelt.
Die fulfill()
Methode:
- Identifiziert das top-level item des Questionnaire
- Erstellt QuestionnaireXyPromise für jenes und ruft
fulfill()
desselben auf - Bei Erfolg kommt ein Array aus
Step
(aus ResearchKit/Stack) zurück, aus welchen - Ein
OrderedTask
erstellt wird
Bei DSTU-2 auf Gruppen- und Fragen-Ebene, ab STU-3 nur noch pro Item (QuestionnaireItem
in FHIR).
Das Gruppen-Promise (oder item mit type=group) sammelt lediglich alle Fragen und erstellt daraus Fragen-Promises, wessen steps gesammelt werden.
- Erstelle einen
InstructionStep
(aus ResearchKit/Stack) nur falls die Gruppe selber einen Text oder Titel hat - Erstelle Fragen-Promises für jede einzelne Frage in der Gruppe und
- Lasse die Fragen-Promises sich erfüllen, bei Erfolg kommt pro Frage ein
QuestionStep
(aus ResearchKit/Stack) zurück- Sammle alle Steps in einen Array, welcher der
QuestionnairePromise
übergeben wird
Die Fragen-Promises werden jeweils für einzelne Fragen erstellt und können die Fragen in entsprechend formattierte QuestionStep
(aus ResearchKit/Stack) umwandeln.
Da einzelne Fragen und ganze Gruppen übersprungen werden können (via enableWhen
property in STU-3, als extension in DSTU-2, s.u.), müssen diese Bedingungen jeweils auch ausgelesen werden, und zwar auf Gruppen- als auch Fragen-Ebene.
Im iOS Framework wurden deshalb die Step
Klassen von ResearchKit gesubclassed, damit denen alle Bedingungen (sowohl die der eigenen Frage als auch der übergeordneten Gruppen) zugewiesen werden können.
Die fulfill()
Methode:
- Bestimmt vom jeweiligen Typ der Frage (FHIR
type
) das entsprechendeAnswerFormat
(aus ResearchKit/Stack) - Asynchron werden etwaige Dependenzen (wie
ValueSet
) aufgelöst - Ein
QuestionStep
(aus ResearchKit/Stack) wird erstellt und entsprechend formattiert und - Merkt sich die eigene
enableWhen
als auch jene der Eltern-Gruppen - Der Step wird an die übergeordnete (Gruppen)Promise übergeben
Details zum Auslesen des answer-formats finden sich in der c3_asAnswerFormat()
als extension zu QuestionnaireGroupQuestion
(DSTU-2) resp. QuestionnaireItem
(STU-3)
Details zum Auslesen der enableWhen
Extension (DSTU-2) finden sich in der c3_enableQuestionnaireElementWhen()
Methode als extension auf Element
(FHIR).