Как сохранить несколько данных в локальный файл json с помощью Codable в Swift - PullRequest
0 голосов
/ 04 февраля 2020

Я работаю с приложением iWatch и отслеживаю 4-минутную прогулку для нескольких данных сердечного ритма каждую секунду.

Я получаю данные, и мне нужно сохранить их в локальном файле json.

Я пытаюсь добавить данные в Codable, но получаю только отдельные данные.

Я новичок в Swift.

Ниже необходим обязательный формат.

{   "items" : [
    {
      "endDate" : "2019-12-11",
      "HeartRate" : "82 BPM",
      "startDate" : "2019-12-11"
    },
    {
      "endDate" : "2019-12-11",
      "HeartRate" : "79 BPM",
      "startDate" : "2019-12-11"
    }   ] }

Ниже приведены мои данные в основном классе.

    func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
              guard let hrType = HKQuantityType.quantityType(forIdentifier: .heartRate),
              let distanceType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) else {
                  return
          }
          if collectedTypes.contains(hrType) {
              if let hrQuantity = workoutBuilder.statistics(for: hrType)?.mostRecentQuantity() {
                  // We want to have BPM
                  let hrUnit = HKUnit(from: "count/min")
                  let hr = Int(hrQuantity.doubleValue(for: hrUnit))
              //    print("HR: \(hr)")
                self.bpmLabel.setText(String(hr))

                let jsonData = HealthItem.init(endDate: formattedDateFromString()!, HeartRate: String(hr), startDate: formattedDateFromString())
                print("jsonData \(jsonData)")
   }
}

struct codable class

struct HealThInfo: Codable {
    let items: [HealthItem]?
}

struct HealthItem: Codable {
    let endDate: String?
    let HeartRate: String?
    let startDate: String?
}

Но, он сохраняет только отдельные данные, а не несколько данных.

jsonData HealthItem (endDate: необязательный («2020-02-04»), HeartRate: необязательный («87»), startDate: необязательный («2020-02-04»))

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Вы можете использовать функцию ниже

func getArrayViaCodable<T : Codable>(arrDict : [[String : Any]]) -> [T]? {
    if let jsonData = try?  JSONSerialization.data(
        withJSONObject: arrDict,
        options: .prettyPrinted
       ){
       do {
           let posts = try JSONDecoder().decode([T].self, from: jsonData)
            return posts
       } catch {
            print(error)
            return nil
       }
   } else {
        return nil
   }
}

Теперь используйте как

if let dictresponse = responsedata as? [String: Any] {
    if let itemArray = data["items"] as? [[String: Any]] {
        let arrHealthInfo : [HealThInfo] = getArrayViaCodable(arrDict: itemArray)
    }
}
0 голосов
/ 04 февраля 2020

Вы никогда не используете объект HealThInfo.

let jsonData = HealthItem.init(endDate: formattedDateFromString()!, HeartRate: String(hr), startDate: formattedDateFromString())
let healtInfo = HealThInfo() // maybe load from disk with previous data?
healtInfo.items.append(jsonData)
print("jsonData \(healtInfo)")
0 голосов
/ 04 февраля 2020

collectTypes - это массив типа HKSampleType . Вы должны перебирать собранный тип, чтобы получить все данные. Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...