func setResultValue()

in iOS/MyStudies/MyStudies/Views/Steps/ActivityStep/ActivityStepResultModel/ActivityStepResult.swift [395:712]


  func setResultValue(stepResult: ORKStepResult, activityType: ActivityType) {

    if (stepResult.results?.count)! > 0 {

      if activityType == .questionnaire {
        // for question Step

        if stepResult.results?.count == 1 && self.type != .form {

          if let questionstepResult: ORKQuestionResult? = stepResult.results?.first
            as? ORKQuestionResult?
          {
            self.setValue(questionstepResult: questionstepResult!)

          } else {

            // for consent step result we are storing the ORKConsentSignatureResult
            let consentStepResult: ORKConsentSignatureResult? =
              (stepResult.results?.first as? ORKConsentSignatureResult?)!
            self.value = consentStepResult

          }
        } else {
          // for form step result

          self.value = [ActivityStepResult]()
          var formResultArray: [Any] = [Any]()
          var j: Int! = 0
          var isAddMore: Bool? = false

          if self.step as? ActivityFormStep != nil {
            if (stepResult.results?.count)!
                > (self.step as? ActivityFormStep)!.itemsArray
                .count
            {
              isAddMore = true
            }
          }
//          else if (stepResult.results?.count)!
//                      > (self.step as? ActivityStep)!.itemsArray
//                      .count
//          {
//            isAddMore = true
//          }
          var localArray: [[String: Any]] = [[String: Any]]()

          for (i, result) in stepResult.results!.enumerated() {

            let activityStepResult: ActivityStepResult? = ActivityStepResult()
            activityStepResult?.startTime = self.startTime
            activityStepResult?.endTime = self.endTime
            activityStepResult?.skipped = self.skipped

            let activityStep = ActivityStep()
            activityStepResult?.step = activityStep

            j = (i == 0 ? 0 : i % (self.step as? ActivityFormStep)!.itemsArray.count)

            // Checking if formStep is RepeatableFormStep
            if isAddMore! {
              if j == 0 {
                localArray.removeAll()
                localArray = [[String: Any]]()
              }

              let stepDict = (((self.step as? ActivityFormStep)!.itemsArray) as [[String: Any]])[j]

              activityStepResult?.key = stepDict["key"] as! String?

            } else {
              activityStepResult?.key = result.identifier
            }
            let itemDict = (self.step as? ActivityFormStep)!.itemsArray[j] as [String: Any]
            activityStepResult?.step?.resultType = (itemDict["resultType"] as? String)!
            if (result as? ORKQuestionResult) != nil {

              let questionResult: ORKQuestionResult? = (result as? ORKQuestionResult)

              if Utilities.isValidValue(
                someObject: (activityStepResult?.step?.resultType as? String as AnyObject)
              ) {
                self.subTypeForForm =
                  activityStepResult?.step?.resultType
                  as? String

              } else {
                self.subTypeForForm = ""
              }

              self.setValue(questionstepResult: questionResult!)

              activityStepResult?.value = self.value
              localArray.append((activityStepResult?.getActivityStepResultDict()!)!)

              // checking if more steps added in RepeatableFormStep
              if isAddMore! {
                if j + 1 == (self.step as? ActivityFormStep)!.itemsArray.count {
                  if localArray.count > 0 {
                    formResultArray.append(localArray)
                  }
                }
              }
            }
            self.value = nil
          }

          if isAddMore! {
            self.value = formResultArray

          } else {
            if localArray.count > 0 {
              formResultArray.append(localArray)
            }
            self.value = formResultArray
          }
        }

      } else if activityType == .activeTask {
        // For Active task like Fetal Kick, Spatial Span Memory & Towers of Honoi
        let activityResult: ORKResult? = stepResult.results?.first
        var resultArray: [[String: Any]]? = Array()

        if (activityResult as? ORKSpatialSpanMemoryResult) != nil {
          // Result Handling for Spatial Span Memory
          let stepTypeResult: ORKSpatialSpanMemoryResult? =
            activityResult
            as? ORKSpatialSpanMemoryResult

          if Utilities.isValidValue(someObject: stepTypeResult?.score as AnyObject?)
            && Utilities.isValidValue(
              someObject: stepTypeResult?.numberOfGames as AnyObject?
            )
            && Utilities.isValidValue(
              someObject: stepTypeResult?.numberOfFailures as AnyObject?
            )
          {

            for i in 0..<3 {
              var resultDict: [String: Any]? = Dictionary()

              resultDict?[kActivityActiveKeyResultType] =
                ActiveStepResultType.numeric
                .rawValue

              switch SpatialSpanMemoryType(rawValue: i)! as SpatialSpanMemoryType {
              case .score:
                resultDict?[kActivityActiveStepKey] = kSpatialSpanMemoryKeyScore
                resultDict?[kActivityStepResultValue] = stepTypeResult?.score

              case .numberOfGames:
                resultDict?[kActivityActiveStepKey] = kSpatialSpanMemoryKeyNumberOfGames
                resultDict?[kActivityStepResultValue] =
                  stepTypeResult?
                  .numberOfGames

              case .numberOfFailures:
                resultDict?[kActivityActiveStepKey] = kSpatialSpanMemoryKeyNumberOfFailures
                resultDict?[kActivityStepResultValue] =
                  stepTypeResult?
                  .numberOfFailures
              }

              if self.startTime != nil
                && (Utilities.getStringFromDate(date: self.startTime!) != nil)
              {

                resultDict?[kActivityStepStartTime] = Utilities.getStringFromDate(
                  date: self.startTime!
                )
              } else {
                let currentDate = Date()
                let dateString = Utilities.getStringFromDate(date: currentDate)

                resultDict?[kActivityStepStartTime] = dateString
              }
              if self.endTime != nil
                && (Utilities.getStringFromDate(date: self.endTime!) != nil)
              {

                resultDict?[kActivityStepEndTime] = Utilities.getStringFromDate(
                  date: self.endTime!
                )
              } else {
                let currentDate = Date()
                let dateString = Utilities.getStringFromDate(date: currentDate)
                resultDict?[kActivityStepEndTime] = dateString
              }
              resultDict?[kActivityStepSkipped] = self.skipped
              resultArray?.append(resultDict!)
            }
            self.key = Study.currentActivity?.actvityId
            self.value = resultArray
          } else {
            self.value = 0
          }
        } else if (activityResult as? ORKTowerOfHanoiResult) != nil {
          // Result Handling for Towers of Honoi
          let stepTypeResult: ORKTowerOfHanoiResult? =
            activityResult
            as? ORKTowerOfHanoiResult

          for i in 0..<2 {
            var resultDict: [String: Any]? = Dictionary()
            // Saving puzzleWasSolved & numberOfMoves
            if TowerOfHanoiResultType(rawValue: i) == .puzzleWasSolved {

              resultDict?[kActivityActiveStepKey] = kTowerOfHanoiKeyPuzzleWasSolved
              resultDict?[kActivityStepResultValue] = stepTypeResult?.puzzleWasSolved
              resultDict?[kActivityActiveKeyResultType] =
                ActiveStepResultType.boolean
                .rawValue

            } else {
              // numberOfMoves
              resultDict?[kActivityActiveStepKey] = kTowerOfHanoiKeyNumberOfMoves
              resultDict?[kActivityStepResultValue] = stepTypeResult?.moves?.count
              resultDict?[kActivityActiveKeyResultType] =
                ActiveStepResultType.numeric
                .rawValue
            }

            if self.startTime != nil
              && (Utilities.getStringFromDate(date: self.startTime!) != nil)
            {

              resultDict?[kActivityStepStartTime] = Utilities.getStringFromDate(
                date: self.startTime!
              )
            } else {
              let currentDate = Date()
              let dateString = Utilities.getStringFromDate(date: currentDate)

              resultDict?[kActivityStepStartTime] = dateString
            }

            // Saving Start & End Time of Step
            if self.endTime != nil
              && (Utilities.getStringFromDate(date: self.endTime!) != nil)
            {

              resultDict?[kActivityStepEndTime] = Utilities.getStringFromDate(
                date: self.endTime!
              )

            } else {
              let currentDate = Date()
              let dateString = Utilities.getStringFromDate(date: currentDate)

              resultDict?[kActivityStepEndTime] = dateString
            }
            resultDict?[kActivityStepSkipped] = self.skipped
            resultArray?.append(resultDict!)

          }
          self.key = Study.currentActivity?.actvityId
          self.value = resultArray

        } else if (activityResult as? FetalKickCounterTaskResult) != nil {
          // Result handling for FetalKickCounter
          let stepTypeResult: FetalKickCounterTaskResult? =
            activityResult
            as? FetalKickCounterTaskResult

          for i in 0..<2 {
            var resultDict: [String: Any]? = Dictionary()

            resultDict?[kActivityActiveKeyResultType] =
              ActiveStepResultType.numeric
              .rawValue

            // Saving Duration & Kick Counts
            if i == 0 {  //Duration
              resultDict?[kActivityActiveStepKey] = kFetalKickCounterDuration
              resultDict?[kActivityStepResultValue] = Double(
                (stepTypeResult?.duration) == nil ? 0 : (stepTypeResult?.duration)!
              )

            } else {  // Kick Count
              resultDict?[kActivityActiveStepKey] = kFetalKickCounterCount
              resultDict?[kActivityStepResultValue] = Double(
                (stepTypeResult?.totalKickCount) == nil
                  ? 0 : (stepTypeResult?.totalKickCount)!
              )
            }

            // Saving Start & End Time of Step
            if self.startTime != nil
              && (Utilities.getStringFromDate(date: self.startTime!) != nil)
            {
              resultDict?[kActivityStepStartTime] = Utilities.getStringFromDate(
                date: self.startTime!
              )
            } else {
              let currentDate = Date()
              let dateString = Utilities.getStringFromDate(date: currentDate)
              resultDict?[kActivityStepStartTime] = dateString
            }
            if self.endTime != nil
              && (Utilities.getStringFromDate(date: self.endTime!) != nil)
            {

              resultDict?[kActivityStepEndTime] = Utilities.getStringFromDate(
                date: self.endTime!
              )
            } else {
              let currentDate = Date()
              let dateString = Utilities.getStringFromDate(date: currentDate)

              resultDict?[kActivityStepEndTime] = dateString
            }
            resultDict?[kActivityStepSkipped] = self.skipped
            resultArray?.append(resultDict!)
          }
          self.value = resultArray
        }
      }
    }
  }