1楼 @tinyfool 没说清楚,我这里的删除,是根据时间段找到(-executeQuery:)要删除的对象,再用-deleteObject:withCompletion:删除。而新保存的对象也在这个时间段里。
根据目前观察的结果,-deleteObject:withCompletion:和-saveObject:withCompletion:都会随机的把具体的执行放在线程里。由于线程的乱序执行,后提交 的新保存(-saveObject:withCompletion:)的对象,有可能被 先提交 的删除操作里的-executeQuery:找到,并被删除-deleteObject:withCompletion:。
当然,如果真的是这个问题导致数据更新不正确,倒也好解决。直接把-saveObject:withCompletion:放在-deleteObject:withCompletion:的completion block里提交执行。
删除和新增的设计的确没啥问题,但是具体到这个应用场景中,好像还是容易因为 忽视 HealthKit的异步执行的特点出问题。
补充说明一下场景:需要用Health按小时记录来自计步器的数据。那么至少在最近这个未完成的小时里,我们可能需要不断刷新这个小时的数据。找到要刷新的数据对象,肯定是根据时间来找,所以不注意异步的特殊性,很可能删掉了新增的对象。