使用 GCD 加载数据非常慢

Data is loading very slow using GCD

我正在尝试从 HealthKit 中提取数据,数据提取正确且速度足够快。我认为我设置 GCD 的方式可能有问题。

代码如下:

- (void)loadGraphDataForType:(NSString *)type withDuration:(int)graphDuration {

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *interval = [NSDateComponents new];

    if (graphDuration == 1) {

        interval.hour = 1;

    } else {

        interval.day = 1;

    }

    NSMutableArray *arrayOfValues = [NSMutableArray new];

    NSDate *anchorDate = [calendar startOfDayForDate:[NSDate date]];

    HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:type];

    dispatch_queue_t queue = dispatch_queue_create([@"graph.queue" UTF8String], DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

        dispatch_semaphore_t lock = dispatch_semaphore_create(0);

        HKStatisticsCollectionQuery *query = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:quantityType quantitySamplePredicate:nil options:HKStatisticsOptionCumulativeSum anchorDate:anchorDate intervalComponents:interval];

        query.initialResultsHandler = ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) {

            if (error) {

                NSLog(@"Error: %@ %@", error, [error userInfo]);

            } else {

                NSDate *endDate = [NSDate date];

                NSDate *startDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:-graphDuration toDate:endDate options:0];

                [results enumerateStatisticsFromDate:startDate toDate:endDate withBlock:^(HKStatistics *result, BOOL *stop) {

                    HKQuantity *quantity = result.sumQuantity;

                    if (quantity != nil) {

                        double value = 0;

                                //Steps Traveled
                                value = [quantity doubleValueForUnit:[HKUnit countUnit]];



                        int intValue = (int)value;

                        [arrayOfValues addObject:@(intValue)];

                    } else {

                        [arrayOfValues addObject:@0];

                    }

                }];

                dispatch_semaphore_signal(lock);

            }

        };

        [self.healthStore executeQuery:query];

        dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);

    });

    dispatch_group_notify(group, queue, ^{

        graphData = [PNLineChartData new];
        graphData.color = [UIColor whiteColor];
        graphData.itemCount = [arrayOfValues count];
        graphData.getData = ^(NSUInteger index) {

            CGFloat yValue = [arrayOfValues[index] floatValue];
            return [PNLineChartDataItem dataItemWithY:yValue];

        };

        graph.chartData = @[graphData];
        [graph strokeChart];

    });

}

如果我在图形获取项目计数的地方放置一个断点,它会显示 25(这是正确的)并且我可以看到数组内部的数据,但是图形需要 5 分钟才能显示出来.我现在尝试了几个不同的库,它们的行为都一样,所以我认为是我的代码中的某些东西导致了它。

我对 GCD 不是很熟悉,所以我确定它与此有关。

如果有人有任何建议,我将不胜感激。

谢谢!

尝试将此 [graph strokeChart]; 包装在 dispatch_async 回到主队列中。

否则我会建议使用仪器分析应用程序。

使用 Time Profiler 检查执行时间并查看花费时间最多的地方。

然后您可以检查线程视图以查看正在完成工作的位置以及正在等待的位置。

不过,您似乎不需要调度组来完成这项工作。