跳到主要内容

数据同步(TSDataSync)

TSDataSync 提供健康数据的每日聚合和原始数据同步。同步结果按数据类型逐项回调,也通过最终 completion 汇总返回。

前提条件​

  • 设备已连接并完成鉴权。
  • 已完成 SDK 初始化。
  • 配置中的 startTime 早于 endTime,且 endTime 不得晚于当前时间。
  • 调用同步前检查 isSyncing,避免并发同步。

数据模型​

TSDataSyncConfig​

属性类型说明
optionsTSDataSyncOption要同步的数据类型,可按位或组合
granularityTSDataGranularity原始数据或按天聚合数据
startTimeNSTimeIntervalUnix 秒时间戳;为 0 时读取数据库中的上次同步时间
endTimeNSTimeIntervalUnix 秒时间戳;为 0 时使用当前时间
includeUserInitiatedBOOL是否包含主动测量,默认 YES

初始化方式:init、initWithOptions:granularity:、initWithOptions:granularity:startTime:endTime:;便捷方法:configForRawDataWithOptions:startTime:endTime:、configForDailyDataWithOptions:startTime:endTime:、configWithOptions:granularity:startTime:。

TSHealthData​

属性类型说明
optionTSDataSyncOption当前结果对应的数据类型
healthValuesNSArray<TSHealthValueModel *> *按时间升序排列的数据;无数据时为空数组
fetchErrorNSError *该类型获取失败时的错误;成功(包括无数据)时为 nil

TSHealthData 可使用 initWithOption:healthValues:fetchError: 及对应类方法创建,也可使用 findHealthDataWithOption:fromArray: 从最终结果中查找某一类型。

TSHealthValueType​

健康数据项的数值类型:TSHealthValueTypeNormal(0,普通值)、TSHealthValueTypeMax(1,最大值)、TSHealthValueTypeMin(2,最小值)和 TSHealthValueTypeResting(3,静息值,仅用于心率)。

枚举与选项​

TSDataGranularity​

值说明
TSDataGranularityRaw (0)单次测量的原始数据
TSDataGranularityDay (1)按天聚合的数据

TSDataSyncOption​

TSDataSyncOptionNone 为 0;其余选项为按位标志:HeartRate、BloodOxygen、BloodPressure、Stress、Sleep、Temperature、ECG、Sport、DailyActivity、HeartRateVar。TSDataSyncOptionAll 为全部选项的组合。

回调类型​

TSDataSyncHealthDataBlock:void (^)(TSHealthData *typeData)。每种通过能力过滤的数据类型完成时在主线程回调一次;单类型失败通过 typeData.fetchError 返回。心率静息值合并在心率结果中,通过数据项的 valueType == TSHealthValueTypeResting 区分。

最终 completion 的签名为:

void (^)(NSArray<TSHealthData *> *_Nullable results, NSError *_Nullable error)

error 只表示阻止同步继续的致命错误;单类型错误在 TSHealthData.fetchError 中返回。

接口方法​

从上次同步时间同步每日数据​

- (void)syncDailyDataFromLastTime:(nullable TSDataSyncHealthDataBlock)onHealthData
completion:(void (^)(NSArray<TSHealthData *> *_Nullable results,
NSError *_Nullable error))completion;

从上次同步时间同步原始数据​

- (void)syncRawDataFromLastTime:(nullable TSDataSyncHealthDataBlock)onHealthData
completion:(void (^)(NSArray<TSHealthData *> *_Nullable results,
NSError *_Nullable error))completion;

使用配置同步​

- (void)syncDataWithConfig:(TSDataSyncConfig *)config
onHealthData:(nullable TSDataSyncHealthDataBlock)onHealthData
completion:(void (^)(NSArray<TSHealthData *> *_Nullable results,
NSError *_Nullable error))completion;

同步示例​

id<TSDataSyncInterface> syncManager = [TopStepComKit sharedInstance].dataSync;
if ([syncManager isSyncing]) {
TSLog(@"[DataSync] 已有同步任务正在执行");
return;
}

TSDataSyncConfig *config = [TSDataSyncConfig configForDailyDataWithOptions:
(TSDataSyncOptionHeartRate | TSDataSyncOptionBloodOxygen)
startTime:[[NSDate dateWithTimeIntervalSinceNow:-7 * 24 * 60 * 60] timeIntervalSince1970]
endTime:[[NSDate date] timeIntervalSince1970]];

[syncManager syncDataWithConfig:config
onHealthData:^(TSHealthData *typeData) {
if (typeData.fetchError) {
TSLog(@"[DataSync] 类型 %ld 失败: %@", (long)typeData.option,
typeData.fetchError.localizedDescription);
return;
}
TSLog(@"[DataSync] 类型 %ld 完成,共 %lu 条",
(long)typeData.option, (unsigned long)typeData.healthValues.count);
} completion:^(NSArray<TSHealthData *> *results, NSError *error) {
if (error) {
TSLog(@"[DataSync] 致命错误: %@", error.localizedDescription);
return;
}
TSHealthData *heartRate = [TSHealthData findHealthDataWithOption:
TSDataSyncOptionHeartRate fromArray:results];
TSLog(@"[DataSync] 最终结果包含心率: %@", heartRate ? @"是" : @"否");
}];

取消和状态​

- (void)cancelSync;
- (BOOL)isSyncing;

cancelSync 立即受理并返回;真正结束通过原同步 completion 返回 eTSErrorSyncCancelled。没有正在同步时调用会被忽略。取消完成前不要启动下一次同步或释放连接。

注意事项​

  1. 所有回调在主线程执行。
  2. healthValues 为空表示该类型在时间范围内没有数据,不等于失败。
  3. 原始数据量通常大于每日数据,建议按时间段分批同步。
  4. includeUserInitiated 为 NO 时只返回自动/被动监测数据。
  5. startTime == 0 使用数据库中的上次同步时间;endTime == 0 使用调用时的当前时间。
  6. 配置无效、设备繁忙、鉴权或网络致命错误通过最终 completion 的 error 返回。