血压 (TSBloodPressure)
血压测量和监测接口,提供手动测量、自动监测以及历史数据同步的功能。血压数据包括收缩压和舒张压值,是心血管健康的重要指标。
前提条件
- 已初始化 TopStepComKit SDK 并成功连接到设备
- 设备支持血压功能(通过
isSupportActivityMeasureByUser或isSupportAutomaticMonitoring方法检查) - 获取到
TSBloodPressureInterface协议实例 - 对于数据同步,设备需要已记录血压数据
数据模型
TSBPValueItem
| 属性名 | 类型 | 说明 |
|---|---|---|
systolic | UInt16 | 收缩压值(mmHg) |
diastolic | UInt16 | 舒张压值(mmHg) |
isUserInitiated | BOOL | 是否为用户主动发起的测量 |
继承自 TSHealthValueItem | — | 包含时间戳等基础属性 |
TSBPDailyModel
| 属性名 | 类型 | 说明 |
|---|---|---|
maxSystolicItem | TSBPValueItem * | 当天最大收缩压条目 |
minSystolicItem | TSBPValueItem * | 当天最小收缩压条目 |
maxDiastolicItem | TSBPValueItem * | 当天最大舒张压条目 |
minDiastolicItem | TSBPValueItem * | 当天最小舒张压条目 |
manualItems | NSArray<TSBPValueItem *> * | 主动测量血压条目数组(按时间升序) |
autoItems | NSArray<TSBPValueItem *> * | 自动监测血压条目数组(按时间升序) |
枚举与常量
无特定枚举或常量定义。
回调类型
| 回调签名 | 说明 |
|---|---|
void (^)(BOOL success, NSError * error) | 测量开始/结束回调:success 表示操作成功,error 包含失败信息 |
void (^)(TSBPValueItem * data, NSError * error) | 实时测量数据回调:data 为实时血压数据,error 包含失败信息 |
void (^)(NSArray<TSBPValueItem *> * bpItems, NSError * error) | 原始血压数据同步完成回调 |
void (^)(NSArray<TSBPDailyModel *> * dailyModels, NSError * error) | 每日血压数据同步完成回调 |
void (^)(TSAutoMonitorBPConfigs * configuration, NSError * error) | 获取自动监测配置回调 |
接口方法
检查设备是否支持手动血压测量
- (BOOL)isSupportActivityMeasureByUser;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | BOOL | 设备是否支持手动血压测量 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
if ([bpInterface isSupportActivityMeasureByUser]) {
TSLog(@"设备支持手动血压测量");
} else {
TSLog(@"设备不支持手动血压测量");
}
启动血压测量
- (void)startMeasureWithParam:(TSActivityMeasureParam *_Nonnull)measureParam
startHandler:(void(^_Nullable)(BOOL success, NSError * _Nullable error))startHandler
dataHandler:(void(^_Nullable)(TSBPValueItem * _Nullable data, NSError * _Nullable error))dataHandler
endHandler:(void(^_Nullable)(BOOL success, NSError * _Nullable error))endHandler;
| 参数 | 类型 | 说明 |
|---|---|---|
measureParam | TSActivityMeasureParam * | 测量活动的参数 |
startHandler | void (^)(BOOL success, NSError * error) | 测量开始回调,success 表示是否成功启动,error 为失败信息 |
dataHandler | void (^)(TSBPValueItem * data, NSError * error) | 实时数据回调,接收测量过程中的血压数据 |
endHandler | void (^)(BOOL success, NSError * error) | 测量结束回调,success 表示正常结束(YES)或中断(NO),error 为异常信息 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
TSActivityMeasureParam *param = [TSActivityMeasureParam new];
// 配置参数...
[bpInterface startMeasureWithParam:param
startHandler:^(BOOL success, NSError *error) {
if (success) {
TSLog(@"血压测量已启动");
} else {
TSLog(@"血压测量启动失败: %@", error.localizedDescription);
}
} dataHandler:^(TSBPValueItem *data, NSError *error) {
if (data) {
TSLog(@"收缩压: %hu mmHg, 舒张压: %hu mmHg", data.systolic, data.diastolic);
} else {
TSLog(@"接收数据失败: %@", error.localizedDescription);
}
} endHandler:^(BOOL success, NSError *error) {
if (success) {
TSLog(@"血压测量正常结束");
} else {
TSLog(@"血压测量异常结束: %@", error.localizedDescription);
}
}];
停止血压测量
- (void)stopMeasureCompletion:(nonnull TSCompletionBlock)completion;
| 参数 | 类型 | 说明 |
|---|---|---|
completion | TSCompletionBlock | 完成回调,返回停止结果 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
[bpInterface stopMeasureCompletion:^(NSError *error) {
if (!error) {
TSLog(@"血压测量已停止");
} else {
TSLog(@"停止血压测量失败: %@", error.localizedDescription);
}
}];
检查设备是否支持自动血压监测
- (BOOL)isSupportAutomaticMonitoring;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | BOOL | 设备是否支持自动血压监测 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
if ([bpInterface isSupportAutomaticMonitoring]) {
TSLog(@"设备支持自动血压监测");
} else {
TSLog(@"设备不支持自动血压监测");
}
检查设备是否支持配置监测时间段
- (BOOL)isSupportMonitorScheduleTime;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | BOOL | 设备是否支持配置监测时间段 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
if ([bpInterface isSupportMonitorScheduleTime]) {
TSLog(@"设备支持配置血压监测时间段");
}
检查设备是否支持配置监测间隔
- (BOOL)isSupportMonitorScheduleInterval;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | BOOL | 设备是否支持配置监测间隔 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
if ([bpInterface isSupportMonitorScheduleInterval]) {
TSLog(@"设备支持配置血压监测时间间隔");
}
配置自动血压监测
- (void)pushAutoMonitorConfigs:(TSAutoMonitorBPConfigs *_Nonnull)configuration
completion:(nonnull TSCompletionBlock)completion;
| 参数 | 类型 | 说明 |
|---|---|---|
configuration | TSAutoMonitorBPConfigs * | 自动血压监测的配置参数 |
completion | TSCompletionBlock | 配置完成回调 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
TSAutoMonitorBPConfigs *config = [TSAutoMonitorBPConfigs new];
// 配置各项参数...
[bpInterface pushAutoMonitorConfigs:config completion:^(NSError *error) {
if (!error) {
TSLog(@"自动血压监测配置已设置");
} else {
TSLog(@"配置失败: %@", error.localizedDescription);
}
}];
获取当前自动血压监测配置
- (void)fetchAutoMonitorConfigsWithCompletion:(nonnull void (^)(TSAutoMonitorBPConfigs *_Nullable configuration, NSError *_Nullable error))completion;
| 参数 | 类型 | 说明 |
|---|---|---|
completion | void (^)(TSAutoMonitorBPConfigs *, NSError *) | 完成回调,返回当前配置或错误 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
[bpInterface fetchAutoMonitorConfigsWithCompletion:^(TSAutoMonitorBPConfigs *configuration, NSError *error) {
if (!error && configuration) {
TSLog(@"获取自动监测配置成功");
// 使用配置信息...
} else {
TSLog(@"获取配置失败: %@", error.localizedDescription);
}
}];
同步指定时间范围内的原始血压数据
- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSBPValueItem *> *_Nullable bpItems, NSError *_Nullable error))completion;
| 参数 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间戳(自1970年以来的秒数) |
endTime | NSTimeInterval | 结束时间戳(自1970年以来的秒数) |
completion | void (^)(NSArray<TSBPValueItem *> *, NSError *) | 完成回调,返回血压测量条目数组 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-7*24*3600]; // 7天前
NSDate *endDate = [NSDate date]; // 现在
[bpInterface syncRawDataFromStartTime:[startDate timeIntervalSince1970]
endTime:[endDate timeIntervalSince1970]
completion:^(NSArray<TSBPValueItem *> *bpItems, NSError *error) {
if (!error && bpItems) {
TSLog(@"同步到 %lu 条原始血压数据", (unsigned long)bpItems.count);
for (TSBPValueItem *item in bpItems) {
TSLog(@"时间: %@, 收缩压: %hu, 舒张压: %hu",
[NSDate dateWithTimeIntervalSince1970:item.timestamp],
item.systolic, item.diastolic);
}
} else {
TSLog(@"数据同步失败: %@", error.localizedDescription);
}
}];
从指定时间同步至今的原始血压数据
- (void)syncRawDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSBPValueItem *> *_Nullable bpItems, NSError *_Nullable error))completion;
| 参数 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间戳(自1970年以来的秒数) |
completion | void (^)(NSArray<TSBPValueItem *> *, NSError *) | 完成回调,返回血压测量条目数组 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-24*3600]; // 24小时前
[bpInterface syncRawDataFromStartTime:[startDate timeIntervalSince1970]
completion:^(NSArray<TSBPValueItem *> *bpItems, NSError *error) {
if (!error) {
TSLog(@"同步 %lu 条血压数据(从过去24小时)", (unsigned long)bpItems.count);
} else {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
同步指定时间范围内的每日血压数据
- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
endTime:(NSTimeInterval)endTime
completion:(nonnull void (^)(NSArray<TSBPDailyModel *> *_Nullable dailyModels, NSError *_Nullable error))completion;
| 参数 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间戳(自1970年以来的秒数),将自动规范化为当天00:00:00 |
endTime | NSTimeInterval | 结束时间戳(自1970年以来的秒数),将自动规范化为当天23:59:59 |
completion | void (^)(NSArray<TSBPDailyModel *> *, NSError *) | 完成回调,返回每日血压模型数组 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-30*24*3600]; // 30天前
NSDate *endDate = [NSDate date]; // 现在
[bpInterface syncDailyDataFromStartTime:[startDate timeIntervalSince1970]
endTime:[endDate timeIntervalSince1970]
completion:^(NSArray<TSBPDailyModel *> *dailyModels, NSError *error) {
if (!error && dailyModels) {
TSLog(@"同步 %lu 天的每日血压数据", (unsigned long)dailyModels.count);
for (TSBPDailyModel *daily in dailyModels) {
TSLog(@"日期: %@, 最高收缩压: %hu, 最低收缩压: %hu",
[NSDate dateWithTimeIntervalSince1970:daily.timestamp],
[daily maxSystolic], [daily minSystolic]);
}
} else {
TSLog(@"数据同步失败: %@", error.localizedDescription);
}
}];
从指定时间同步至今的每日血压数据
- (void)syncDailyDataFromStartTime:(NSTimeInterval)startTime
completion:(nonnull void (^)(NSArray<TSBPDailyModel *> *_Nullable dailyModels, NSError *_Nullable error))completion;
| 参数 | 类型 | 说明 |
|---|---|---|
startTime | NSTimeInterval | 开始时间戳(自1970年以来的秒数),将自动规范化为当天00:00:00 |
completion | void (^)(NSArray<TSBPDailyModel *> *, NSError *) | 完成回调,返回每日血压模型数组 |
代码示例:
id<TSBloodPressureInterface> bpInterface = /* 获取血压接口实例 */;
NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:-7*24*3600]; // 7天前
[bpInterface syncDailyDataFromStartTime:[startDate timeIntervalSince1970]
completion:^(NSArray<TSBPDailyModel *> *dailyModels, NSError *error) {
if (!error && dailyModels) {
TSLog(@"同步 %lu 天的每日血压统计", (unsigned long)dailyModels.count);
for (TSBPDailyModel *daily in dailyModels) {
NSUInteger manualCount = daily.manualItems.count;
NSUInteger autoCount = daily.autoItems.count;
TSLog(@"主动测量: %lu 次, 自动监测: %lu 次", manualCount, autoCount);
}
} else {
TSLog(@"同步失败: %@", error.localizedDescription);
}
}];
每日数据模型方法
获取当天最大收缩压值
- (UInt16)maxSystolic;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | UInt16 | 最大收缩压值,无数据时返回0 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
UInt16 max = [daily maxSystolic];
TSLog(@"当天最大收缩压: %hu mmHg", max);
获取当天最小收缩压值
- (UInt16)minSystolic;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | UInt16 | 最小收缩压值,无数据时返回0 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
UInt16 min = [daily minSystolic];
TSLog(@"当天最小收缩压: %hu mmHg", min);
获取当天最大舒张压值
- (UInt16)maxDiastolic;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | UInt16 | 最大舒张压值,无数据时返回0 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
UInt16 max = [daily maxDiastolic];
TSLog(@"当天最大舒张压: %hu mmHg", max);
获取当天最小舒张压值
- (UInt16)minDiastolic;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | UInt16 | 最小舒张压值,无数据时返回0 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
UInt16 min = [daily minDiastolic];
TSLog(@"当天最小舒张压: %hu mmHg", min);
获取所有测量条目
- (NSArray<TSBPValueItem *> *)allMeasuredItems;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | NSArray<TSBPValueItem *> * | 合并的主动和自动测量条目,按时间排序 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
NSArray<TSBPValueItem *> *allItems = [daily allMeasuredItems];
TSLog(@"当天总测量次数: %lu", (unsigned long)allItems.count);
从数据库字典构建每日模型
+ (NSArray<TSBPDailyModel *> *)dailyModelsFromDBDicts:(NSArray<NSDictionary *> *)dicts;
| 参数 | 类型 | 说明 |
|---|---|---|
dicts | NSArray<NSDictionary *> * | 血压明细行的字典数组 |
| 返回值 | NSArray<TSBPDailyModel *> * | 排序后的每日模型数组 |
代码示例:
NSArray<NSDictionary *> *dbRows = /* 从数据库获取血压行 */;
NSArray<TSBPDailyModel *> *dailyModels = [TSBPDailyModel dailyModelsFromDBDicts:dbRows];
TSLog(@"构建了 %lu 个每日模型", (unsigned long)dailyModels.count);
获取调试描述
- (NSString *)debugDescription;
| 参数 | 类型 | 说明 |
|---|---|---|
| 返回值 | NSString * | 包含极值和列表条数的多行调试信息 |
代码示例:
TSBPDailyModel *daily = /* 获取每日模型 */;
TSLog(@"%@", [daily debugDescription]);
值项转换方法
从数据库字典数组转换为值项数组
+ (NSArray<TSBPValueItem *> *)valueItemsFromDBDicts:(NSArray<NSDictionary *> *)dicts;
| 参数 | 类型 | 说明 |
|---|---|---|
dicts | NSArray<NSDictionary *> * | 数据库字典数组 |
| 返回值 | NSArray<TSBPValueItem *> * | 转换后的值项数组 |
从单个数据库字典转换为值项
+ (TSBPValueItem *)valueItemFromDBDict:(NSDictionary *)dict;
| 参数 | 类型 | 说明 |
|---|---|---|
dict | NSDictionary * | 单个数据库字典 |
| 返回值 | TSBPValueItem * | 转换后的值项 |
注意事项
-
时间戳格式:所有时间参数均使用自1970年1月1日以来的秒数,可通过
NSDate的timeIntervalSince1970属性获取 -
每日数据规范化:
syncDailyDataFromStartTime:endTime:completion:方法会自动将时间参数规范化到日期边界(00:00:00 - 23:59:59),无需手动处理 -
数据排序:返回的血压数据始终按时间升序排列,便于直接使用或绘制趋势图
-
设备能力检查:使用前务必调用相应的
isSupportXXX方法检查设备是否支持该功能,避免调用不支持的方法 -
回调线程:所有完成回调均在主线程调用,可直接更新 UI
-
用户主动测量标识:
TSBPValueItem的isUserInitiated属性可用于区分用户主动测量和设备自动监测的数据 -
实时数据处理:测量过程中
dataHandler可能多次回调,每次返回最新的测量结果 -
错误处理:所有异步操作都应检查返回的
NSError对象,不要假设操作必然成功 -
配置同步:修改自动监测配置后立即调用
pushAutoMonitorConfigs:completion:使配置生效 -
内存管理:确保在使用回调块时避免循环引用,可使用
__weak修饰符