我正在寻找一种智能方法,以智能方式从HealthKit导入所有数据,以便大量用户每天数百次记录某些HealthKit值数月或数年。我也希望从主线程中做到这一点,并且用户可以随时关闭应用程序这一事实。以下是我目前的实施情况:
- (void) fullHealthKitSyncFromEarliestDate {
dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);
NSLog(@"fullHealthKitSyncFromEarliestDate");
NSDate *latestDate = [PFUser currentUser][@"earliestHKDate"];
if (!latestDate) latestDate = [NSDate date];
NSDate *earliestDate = [healthStore earliestPermittedSampleDate];
NSLog(@"earliest date %@ and latest date %@", earliestDate, latestDate);
if ([earliestDate earlierDate:[[NSDate date] dateByAddingYears:-2]] == earliestDate) {
earliestDate = [[NSDate date] dateByAddingYears:-1];
}
__block NSDate *laterDate = latestDate;
__block NSDate *earlierDate = [latestDate dateByAddingMonths:-1];
int i = 0;
while ([earlierDate earlierDate:earliestDate] == earliestDate) {
// DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(i * 30 * NSEC_PER_SEC)), serialQueue, ^{
NSLog(@"calling sync from %@ to %@", earlierDate, laterDate);
[self syncfromDate: earlierDate toDate:laterDate];
laterDate = [laterDate dateByAddingMonths:-1];
earlierDate = [laterDate dateByAddingMonths:-1];
earlierDate = [[earliestDate dateByAddingSeconds:1] laterDate:earlierDate];
});
}
}
我遇到上述代码的一些问题:
earlierDate
有时无法在下一次迭代中更新。它有点奇怪的重叠,有时相同的日期范围会被调用两次甚至更多次。我意识到没有附加代码的细节,这可能太难以解决,但人们可以告诉我你想要从HealthKit检索大量数据的情况下实施了哪种解决方案。我意识到我可能会得到像HealthKit那样的回答......为什么要复制所有数据?'。我只想说它是必需的,而且没有办法解决它。
另外,我只是完全误解了如何使用串行队列?
理想情况下,我想执行以下操作:(1)在此for循环(2)中一次只运行一个查询,并在它们之间的一段合理时间内运行它们,比如说间隔30秒,因为在每个查询结束时,我确实需要在主qeue上做一些接口更新(3)在后台循环上执行所有查询,这样它不会降低接口性能并且可以随时被杀死用户决定他将杀死该应用程序。这就是我认为我会用上述方法实现的......如果有人能告诉我线程出错的地方我真的很感激。谢谢!