【发布时间】:2021-04-29 00:44:29
【问题描述】:
我正在通过访问苹果的 healthkit 中的健康数据来开发一个健康应用程序。我可以访问血压和 BMI 数据。
我希望将此数据以 JSON 格式发送回我的 JS 文件。
要求的格式是这样的
{ "items" : [
{
"endDate" : "2020-01-25",
"BloodPressure" : "122/65",
"startDate" : "2020-01-25"
},
{
"endDate" : "2020-01-25",
"BMI" : "24.6",
"startDate" : "2020-01-25"
} ] }
我的 BP 和 BMI 查询是:
func getBloodPressure(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
var value : Any = ""
guard let type = HKQuantityType.correlationType(forIdentifier: HKCorrelationTypeIdentifier.bloodPressure),
let systolicType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bloodPressureSystolic),
let diastolicType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bloodPressureDiastolic) else {
return
}
let now = Date()
let startDate = Calendar.current.startOfDay(for: now)
let endDate = now
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)
let sampleQuery = HKSampleQuery(sampleType: type, predicate: predicate, limit: 0, sortDescriptors: nil) { (sampleQuery, results, error) in
if let dataList = results as? [HKCorrelation] {
for data in dataList
{
if let data1 = data.objects(for: systolicType).first as? HKQuantitySample,
let data2 = data.objects(for: diastolicType).first as? HKQuantitySample {
let value1 = data1.quantity.doubleValue(for: HKUnit.millimeterOfMercury())
let value2 = data2.quantity.doubleValue(for: HKUnit.millimeterOfMercury())
value = "\(value1) / \(value2)"
resolve(value)
}}}}
healthStore.execute(sampleQuery)
}
@objc
func getBMI(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) {
let bodyMassType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMassIndex)
let query = HKSampleQuery(sampleType: bodyMassType!, predicate: nil, limit: 1, sortDescriptors: nil) { (query, results, error) in
if let result = results?.first as? HKQuantitySample {
let bodyMassIndex = result.quantity.doubleValue(for: HKUnit.count())
print("BMI in xcode",bodyMassIndex, result.endDate)
resolve(bodyMassIndex)
return
}}
healthStore.execute(query)
}
现在我创建了 2 个结构:
struct BloodPressureItem: Codable {
let endDate: String?
let BloodPressure: String?
let startDate: String?
}
struct BodyMassIndexItem: Codable {
let endDate: String?
let BMI: String?
let startDate: String?
}
接下来我将我的数据附加到对象中。
let jsonData = BloodPressureItem.init(endDate: end, Bloodpressure: String(value), startDate: start)
let jsonData = BodyMassIndexItem.init(endDate: end, BMI: String(bodyMassIndex), startDate: start)
我得到的结果是
BloodPressureItem(endDate: Optional("2021-01-25 07:43:27 +0000"), BloodPressure: Optional("122.0/65.0"), startDate: Optional("2021-01-24 07:43:27 +0000"))
BodyMassIndexItem(endDate: Optional("2021-01-25 07:43:27 +0000"), BMI: Optional("24.6"), startDate: Optional("2021-01-24 07:43:27 +0000"))
接下来如何将其转换为我需要的格式?
更新:
{ "items" : [
“BloodPressure:” {
"endDate" : "2020-01-25",
“Value” : "122/65",
"startDate" : "2020-01-25"
},
“BMI:” {
"endDate" : "2020-01-25",
“Value” : "24.6",
"startDate" : "2020-01-25"
} ] }
【问题讨论】:
-
用
Encodable对异构数组进行编码是相当费力的。我更喜欢JSONSerialization。 -
我会使用枚举,并根据键使用一个或另一个。枚举很棒!