在核心绘图 iOS 中动态获取绘图范围的数据

Posted

技术标签:

【中文标题】在核心绘图 iOS 中动态获取绘图范围的数据【英文标题】:Dynamically fetch data for plot range in core plot iOS 【发布时间】:2015-01-09 10:21:16 【问题描述】:

我正在编写一个应用程序,它可以长时间(长达几个小时)记录一些数据,并以图形/绘图的形式显示数据。我正在使用核心数据存储我记录的值,并使用核心图将它们显示在散点图中。我的核心数据实体如下所示:

我的实体

时间戳:日期 someValue:Integer 64

我的核心绘图图是一个散点图,它在 y 轴上显示“someValue”值,在 x 轴上显示“timeStamp”值。

屏幕截图显示了核心情节的样子。

问题是我有很多值(在几个小时内每秒都会将值添加到核心数据库中)。我不想获取我所有的核心数据实体并将它们加载到内存中以便立即显示在核心图中。相反,我宁愿只从我的核心数据存储中获取位于可见绘图范围内的实体,然后使用核心绘图显示它们。我会将获取的结果存储在 NSArray 或类似的东西中,并在我的 CPTPlotDataSource 方法中使用 NSArray 来填充绘图。当范围发生变化时,我的 NSArray 总是会被覆盖,因此只有可见的数据点会保存在内存中。

我认为我会使用

- (CPTPlotRange *)plotSpace:(CPTPlotSpace *)space
  willChangePlotRangeTo:(CPTPlotRange *)newRange
          forCoordinate:(CPTCoordinate)coordinate

CPTPlotSpaceDelegate 的方法,并使用时间戳作为谓词从核心数据中获取相关实体。但是,我不知道该怎么做。给定绘图的当前范围,有没有办法访问时间戳值?我考虑尝试访问我的 x 轴标签,因为它们显示当前时间并使用它从我的数据存储中获取,但我不知道如何。这甚至是正确的方法吗?任何帮助表示赞赏。

【问题讨论】:

您必须知道 CPTPlotRange 在时间戳方面的含义,您可以在 CoreData 提取中使用 NSPredicate 【参考方案1】:

好的,我设法弄明白了:)。这是我的解决方案,以防其他人偶然发现这个问题:

我意识到获取可见日期范围的唯一方法是从轴标签中提取日期值。然后我使用这些日期值对我的核心数据模型执行查询。我使用 CPTAxisDelegate 方法 shouldUpdateAxisLabelsAtLocations 做到了这一点。每当范围以任何方式发生变化(通过平移/缩放)时,都会调用该委托方法。这是我所做的:

-(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations
    //Extract the NSDate values from the axis labels
    NSFormatter *formatter = axis.labelFormatter;
    NSMutableArray *rangeDates = [[NSMutableArray alloc]init];
    for ( NSDecimalNumber *tickLocation in locations ) 
        NSString *labelString       = [formatter stringForObjectValue:tickLocation];

       //Generate an NSDate object from the label
       NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
       [dateFormatter setDateFormat:@"HH:mm:ss"];
       NSDate *date = [dateFormatter dateFromString:labelString];
       [rangeDates addObject:date];
    

    //Sort dates in ascending order (old to new) since they aren't sorted in the tickLocation array
    [rangeDates sortUsingSelector:@selector(compare:)];
    NSDate *startDate = rangeDates[0];
    NSDate *endDate = rangeDates[rangeDates.count-1]; 

    //Modify dates as needed and perform core data query using start and end dates
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timestamp >= %@ AND timestamp <= %@", startDate, endDate];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext]];
    [request setPredicate:predicate];
    NSError *error = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];

使用此方法,我能够仅获取我的核心数据存储中当前在图中可见的记录。我希望这对遇到严重问题的人有所帮助。

【讨论】:

以上是关于在核心绘图 iOS 中动态获取绘图范围的数据的主要内容,如果未能解决你的问题,请参考以下文章

cesuim 绘图贴模型怎么获取范围之内的三角网

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

Flask框架:运用Ajax轮询动态绘图

Flask框架:如何运用Ajax轮询动态绘图

使用闪亮动态地将绘图添加到网页