如何正确的修改HealthKit数据?

func 发布于 2015年01月26日
无人欣赏。

HealthKit似乎只提供删除(-deleteObject:withCompletion:)和保存(-saveObject:withCompletion:)两个方法,而没有提供修改数据的方法。这两个方法都是异步执行的。

如果我希望刷新数据,就得先把就数据删除,然后在把新数据保存上去。那么问题来了,有没有可能我提交的删除会在提交的保存后执行?也就是说,我要刷新的数据反而被删除了?

谢谢!

共2条回复
tinyfool 回复于 2015年01月26日
  1. 肯定不可能吧,首先删除的对象和你新保存的对象干嘛要是一个对象?如果不是一个对象则百分百不可能误删除
  2. 这里本来就不该有修改这个逻辑,除非是手动记录,仍旧是即使有手动记录,也不应该有修改,删除和新增是合理的设计
func 回复于 2015年01月27日

1楼 @tinyfool 没说清楚,我这里的删除,是根据时间段找到(-executeQuery:)要删除的对象,再用-deleteObject:withCompletion:删除。而新保存的对象也在这个时间段里。

根据目前观察的结果,-deleteObject:withCompletion:和-saveObject:withCompletion:都会随机的把具体的执行放在线程里。由于线程的乱序执行,后提交 的新保存(-saveObject:withCompletion:)的对象,有可能被 先提交 的删除操作里的-executeQuery:找到,并被删除-deleteObject:withCompletion:。

当然,如果真的是这个问题导致数据更新不正确,倒也好解决。直接把-saveObject:withCompletion:放在-deleteObject:withCompletion:的completion block里提交执行。

删除和新增的设计的确没啥问题,但是具体到这个应用场景中,好像还是容易因为 忽视 HealthKit的异步执行的特点出问题。

补充说明一下场景:需要用Health按小时记录来自计步器的数据。那么至少在最近这个未完成的小时里,我们可能需要不断刷新这个小时的数据。找到要刷新的数据对象,肯定是根据时间来找,所以不注意异步的特殊性,很可能删掉了新增的对象。

登录 或者 注册