大多数浏览器和
Developer App 均支持流媒体播放。
-
顺利处理 FHIR 流程
了解 FHIRModels 如何为所有 FHIR 资源创建本机数据模型,如何提供数据验证从而增强资源完整性,并防止在 FHIR 规范的多个版本中创建结构无效的资源。 无论你是要处理从 HealthKit 获得的临床数据还是直接从临床系统获取的数据,FHIRModels 都能让操纵 FHIR 更简单。
资源
相关视频
WWDC21
WWDC20
-
下载
(你好 WWDC 2020)
你好 欢迎参加 WWDC (顺利处理 FHIR 流程) 你好 我叫 Pascal 我今天要讲的是 如何顺利处理 FHIR 流程 你可能已经知道 自 2018 年初起 健康 app 开始支持 快捷式医疗服务互操作资源 将临床数据下载到你的电话上 此类资源有个更广为人知的名字 即 FHIR
这一功能的实现 需要归功于 HL7 和 SMART 团队制定的开放标准 健康 app 所利用的正是这一系列标准
来回顾一下吧 对我们而言 一切始于健康 app 健康 app 会直接与 健康服务提供商的 API 建立安全连接
然后将 FHIR 数据 直接下载到 iOS 设备上
这些数据被安全存储到 HealthKit 中 使来自多个机构的数据得以聚合 然后你便可以通过 HealthKit API 来访问这些数据了
下载结束时 经过整理的临床数据会 干净地呈现在健康 app 中 (健康记录) 现在我们来看一看 你的 app 是如何获取 这些 FHIR 数据 并配合它进行工作的
首先 你的 app 会要求用户授权
用户需要经过三个画面的引导 来完成授权流程
第一个画面 显示的是有关授予访问权限时 所需内容的一般信息 接着是你在 app 的 Info.plist 中 提供的解释性文本 同时附上了隐私政策的链接
没错 我们会审核你的隐私政策
在这个药物清单 app 的简单例子里 它只要求获得访问药物的权限 这符合我们的数据使用原则 即“与你的需求成正比” 最后 在默认状态下 只有设备内现有的 数据才会与你的 app 分享 因此你每一次查询 FHIR 数据时 都要请求授权 以便确保用户有机会 在适用情况下向你的 app 授予 访问新数据的权限 如果没有需要授权的内容 则表格不会出现
关于此流程的更多详情 请参见我们 2018 年的 WWDC 讲座 (使用 HealthKit 访问健康数据) 现在你的 app 已经有权限 访问临床健康记录了 下面我们就来进一步了解一下 FHIR 数据 这是一个简化版的 FHIR 处方资源 里面有各种各样的字段类型 简单的字符串 只能采取特定值的字符串 所谓的代码
以类似 ISO-8601 的格式 呈现在字符串中的日期与时间 诸如布尔数据和数字等其他基元类型 以及由图元组成的复杂嵌套结构
在此之前 如果你想处理本机格式的 FHIR 数据 那么你必须要自己去编写 Swift 可编码 如果你只想查看特定的数据元素 并且你知道这些数据是统一的 这个过程似乎还是很简单的 在这个例子里 你只想查看某个处方的 状态、日期和它所涉及的药物
但很快你就会意识到 FHIR 资源的深度、复杂性 甚至其数量之繁多 只要你去深入探究 这个处方资源的完整定义 没错 你应该不会想要自己一个人完成 如此繁重的建模工作
那么 我们怎样才能帮助你 处理 FHIR 数据呢?
下面要介绍的是 FHIRModel FHIRModel 是一种开源 Swift 套件 可以通过 GitHub 下载 它可以让你提交问题 请求特性 提供一般性的反馈意见 它对多个 FHIR 版本均提供了支持 并为其中一个版本内的所有资源 提供了数据模型
编码和解码时会强制要求资源完整性 以免你创建出结构性无效的资源
它会进行日期/时间解析 通过枚举来强制执行代码字段 通过枚举来强制执行 value 多态属性 除此之外还有很多
当然 我们会随时对该套件进行更新 让它能支持新版本的 FHIR 和 Swift
该套件自带 DSTU2、R4 和最新构建版本的资料库 我们会随时为新出现的版本添加支持
该套件由 CareKit 的朋友们联合主管 可以通过 GitHub 下载
下面我们来讲一下 FHIR
这串代码讲的是 在通过 HealthKit API 获取临床数据后 如何利用这些数据 建构一套成熟的 FHIR 数据模型 首先 从 FHIRModel 套件中 导入 HealthKit 和 DSTU2 资料库
从 HealthKit 中取得 HKClinicalRecord 以及和它相关联的 HK fhirResource 你可以查看 HK fhirResource 以确认它的类型
解析该资源的 JSON 数据 在此情况 我们要接收一个 MedicationOrder 实例 然后你便可以打印 note 语句了
我们来让它变得更复杂一点 用一个深层嵌套结构 将剂量说明与和它相关的日期范围 一起呈现出来
首先 编写一个 TimingRepeat 的扩展 TimingRepeat 是 FHIRModel 所提供的一个类型 我们想提取这段限定时期的 开始日期和结束日期
在现实世界中 最好 让它的适用范围变得更加广泛 例如检查可空类型 使用一个好的旧日期 formatter 等
然后映射该处方剂量说明的全部内容
使用你的新扩展来给这些说明 加上一个日期范围作前缀 这个日期范围代表这些说明的有效期
FHIR 还有一个有趣的地方 那就是目前人们所使用的版本不一 2014 年秋天 发布了首个标准草案 也就是 DSTU1 供开发者们试用 (FHIR 的各个版本) 之后又陆续发布了三个主要版本 这是截止到目前的情况
很快 第五版也将面世 然而 正如我之前所提到的 当新版本发布时 现有的 API 并不会自动更新 你很可能会想要为比较流行的版本 多提供几年的支持 特别是 DSTU2
那么我们就来看一看如何通过 FHIRModel 来为多个 FHIR 版本提供支持吧
首先 从 FHIRModel 中导入合适的资源库
然后 假设你有一个 FHIRRelease 枚举 里面有你想要支持的所有 FHIR 版本 需要用到的数值 请先切换版本 然后再使用 JSON 解码器 辅以合适的模型类型 我们对 DSTU2 使用 MedicationOrder 对 R4 使用 MedicationRequest 最后 浏览相应的属性 以便抵达你想要提取的数值 通过 FHIRModel 能够做到的事情 还远远不止于此
一句话总结 FHIRModel 可以帮助你 处理复杂的 FHIR 资源 甚至各个 FHIR 版本
在处理通过 HealthKit API 获取的 临床数据时 请使用该套件
此外 也请看一看 《Carekit 有哪些更新》 了解一下如何搭配使用 FHIR 和 CareKit 来构建护理类的 app
或是利用这个套件来增强你自己的 独立 FHIR app
你能做的有以下这些 克隆整个资料库 将它添加到你的项目里 然后开始探索代码
提交问题 哪怕你只是想提供反馈意见 或是提出一些疑问
获取我们的样例 app 它会告诉你如何将 FHIRModel 与一个使用 HealthKit API 的 app 相整合
你可以访问 chat.fhir.org 来进一步了解 FHIR 和发表你自己的意见
感谢观看 祝你代码写得愉快
-
-
4:32 - Use FHIRModels with Health Records FHIR data from HealthKit
// Use with Health Records FHIR data from HealthKit import HealthKit import ModelsDSTU2 // Grab HKClinicalRecord from HealthKit API let clinicalRecord: HKClinicalRecord let resource = clinicalRecord.fhirResource! // Print the prescription note let decoder = JSONDecoder() let prescription = try decoder.decode(MedicationOrder.self, from: resource.data) print("\(prescription.note)")
-
5:04 - Use FHIRModels with Health Records FHIR data from HealthKit, part 2
// Make using "TimingRepeat" period dates easier by writing an extension extension TimingRepeat { var periodDisplayString: String? { if case .period(let period) = bounds { return "\(period.start) - \(period.end)" } return nil } } // Collect all dosage instructions on medication prescriptions let instructions: [String] = prescription.dosageInstruction?.map { dosage in guard let period = dosage.timing?.repeat?.periodDisplayString else { return "\(dosage.text)" } return "\(period): \(dosage.text)" }
-
6:20 - Supporting multiple FHIR releases
// Supporting multiple releases import ModelsDSTU2 import ModelsR4 let decoder = JSONDecoder() let release: FHIRRelease let data: Data let note: String? = nil switch release { case .dstu2: let model = try decoder.decode(ModelsDSTU2.MedicationOrder.self, from: data) note = model.note?.value?.string case .r4: let model = try decoder.decode(ModelsR4.MedicationRequest.self, from: data) note = model.note?.compactMap({ $0.text.value?.string }).joined(separator: "\n") default: note = "Unsupported FHIR release \(release)" }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。