从HealthKit进行大规模数据同步的最佳方式?

时间:2016-04-29 18:11:00

标签: objective-c multithreading health-kit

我正在寻找一种智能方法,以智能方式从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有时无法在下一次迭代中更新。它有点奇怪的重叠,有时相同的日期范围会被调用两次甚至更多次。
  • 内核内存分配问题(当我检索对象时,我将其排队以便上传到远程服务器)
  • 接口完全停止响应,即使这一切都发生在主队列之外。下游可能会有一些在整个查询结束时被调用的东西...但我仍然感到惊讶,界面基本上完全停止响应。在短时间内通常可以很好地进行类似的同步。在这里,我只是间隔30秒,每次只做一个月的查询

我意识到没有附加代码的细节,这可能太难以解决,但人们可以告诉我你想要从HealthKit检索大量数据的情况下实施了哪种解决方案。我意识到我可能会得到像HealthKit那样的回答......为什么要复制所有数据?'。我只想说它是必需的,而且没有办法解决它。

另外,我只是完全误解了如何使用串行队列?

理想情况下,我想执行以下操作:(1)在此for循环(2)中一次只运行一个查询,并在它们之间的一段合理时间内运行它们,比如说间隔30秒,因为在每个查询结束时,我确实需要在主qeue上做一些接口更新(3)在后台循环上执行所有查询,这样它不会降低接口性能并且可以随时被杀死用户决定他将杀死该应用程序。这就是我认为我会用上述方法实现的......如果有人能告诉我线程出错的地方我真的很感激。谢谢!

0 个答案:

没有答案