Skip to content

Instantly share code, notes, and snippets.

@p2
Last active April 20, 2016 11:24
Show Gist options
  • Save p2/db9a537a93caf8722a20ccd42ce3c3ba to your computer and use it in GitHub Desktop.
Save p2/db9a537a93caf8722a20ccd42ce3c3ba to your computer and use it in GitHub Desktop.

C3-PRO Übersicht - Questionnaires

QuestionnaireController

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:

  1. Stellt sicher, dass der Controller ein FHIR Questionnaire hat
  2. Erstellt ein Promise für das Questionnaire QuestionnairePromise
  3. Wartet darauf, dass die Promise erfüllt wird, welche bei Erfolg
  4. Ein OrderedTask (aus ResearchKit/Stack) retourniert
  5. 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.

QuestionnairePromise

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:

  1. Identifiziert das top-level item des Questionnaire
  2. Erstellt QuestionnaireXyPromise für jenes und ruft fulfill() desselben auf
  3. Bei Erfolg kommt ein Array aus Step (aus ResearchKit/Stack) zurück, aus welchen
  4. Ein OrderedTask erstellt wird

QuestionnaireXyPromise

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.

  1. Erstelle einen InstructionStep (aus ResearchKit/Stack) nur falls die Gruppe selber einen Text oder Titel hat
  2. Erstelle Fragen-Promises für jede einzelne Frage in der Gruppe und
  3. Lasse die Fragen-Promises sich erfüllen, bei Erfolg kommt pro Frage ein
  4. QuestionStep (aus ResearchKit/Stack) zurück
  5. 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:

  1. Bestimmt vom jeweiligen Typ der Frage (FHIR type) das entsprechende AnswerFormat (aus ResearchKit/Stack)
  2. Asynchron werden etwaige Dependenzen (wie ValueSet) aufgelöst
  3. Ein QuestionStep (aus ResearchKit/Stack) wird erstellt und entsprechend formattiert und
  4. Merkt sich die eigene enableWhen als auch jene der Eltern-Gruppen
  5. 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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment