iPhone iOS在呈现图表时如何处理Core Data中的时间间隔?
Posted
技术标签:
【中文标题】iPhone iOS在呈现图表时如何处理Core Data中的时间间隔?【英文标题】:iPhone iOS how to deal with time gaps in Core Data when presenting a graph? 【发布时间】:2012-10-07 20:44:22 【问题描述】:如果序列之间存在时间间隔,我遇到了如何在单个图表上显示核心数据实体序列的问题。
我得到了一个固定长度的条形图(由 UITableView 支持),每个条形由一个核心数据实体表示,所有实体都带有时间戳并相互跟随,因此对此类数据进行排序会产生如下图。这种图的好处是NSFetchedResultsController
可用于动态更新表格视图以响应添加的新事件。结果是在用户看来,随着时间的推移,新的条形图会添加到左侧。
我的问题是 我想扩展这个图表,让它 24 小时长并且可以左右滚动。在这种情况下,会有一些情节没有数据存在应用。最终结果是,如果我在数据存在间隙时依赖 NSFetchedResultsController,并且我想为丢失的数据显示空白单元格。
我对你将如何解决这个问题很感兴趣。
我看到了两种可能的解决方案:
1) 放弃使用NSFetchedResultsController
的方法,而是手动计算UITableView
中的柱数。每个条形图由开始日期和结束日期定义。然后我可以使用NSFetchRequest
和谓词来查询每个柱的数据。如果有一个事件的时间戳在条形的日期范围内,则显示一个条形,否则显示一个空白。
方法#1 的问题在于它很慢,虽然它允许滚动浏览整个数据集,但它很慢而且滞后,因为每个获取请求都是针对每个新柱执行的。此外,我需要手动刷新表格以响应添加的新数据,这很难正确实现。
2) 也许我可以使用空白事件预先填充数据集,然后在数据可用时“填充”它们。这将允许我使用获取的结果控制器保留表格视图,从而实现更平滑的滚动,但代价是显着增加应用程序使用的持久存储(因为将在应用程序使用之间创建空白实体)。
如果有我没有想到的其他方法,我会徘徊。您将如何创建一个允许在应用的持久数据存储中存在“间隙”的侧面可滚动条形图?
感谢您的意见!
【问题讨论】:
【参考方案1】:您的问题确实与 Core Data 或 NSFetchedResultsController 没有(或不应该)任何关系。你的图表视图如何绘制它给出的数据完全取决于图表视图。没有理由你不能编写一个使用 NSFetchedResultsController 的图表视图并且适当地处理数据中的间隙,但 UITableView 从来没有打算处理丢失/空单元格。
问题不在于您使用的是 Core Data 或 NSFetchedResultsController。问题是你在滥用 UITableView。
绘制条形图非常简单——它只是在适当位置绘制的一系列矩形。您可以为您的视图提供一个获取的结果控制器,并让它查看fetchedObjects
属性以获取当前的对象列表。然后,它可以根据需要渲染尽可能多的对象,并且可以使用每个对象的开始和结束日期来定位图形上的绘图。将您的图表放在 UIScrollView 中,这样您就不必担心滚动。如果图表变大,请添加平铺,以便您只绘制用户正在查看的部分,就像 UITableView 一样。
看起来您目前也在表格视图上方绘制了一些内容。如果您创建自己的图表视图,您可能会考虑同时绘制额外的内容(红线、红色和绿色气泡、高 REM 概率的东西)。这样做可以很容易地确保所有内容都在图表上正确定位(这对于您当前的方案可能有点麻烦)。
【讨论】:
您也可以查看CorePlot进行图形渲染。 谢谢大家。滥用表格视图似乎是一个好方法,因为它处理缓存和平铺。如果我要自己使用矩形和滚动视图绘制可滚动图形,我会偶然发现缓存和平铺的问题:/ 我真的无法忍受将核心图导入项目并在导入后正确配置的复杂程度。跨度>以上是关于iPhone iOS在呈现图表时如何处理Core Data中的时间间隔?的主要内容,如果未能解决你的问题,请参考以下文章
用户关闭应用程序时如何处理用户在 Xamarin iOS 上单击本地通知?
使用 iOS 模拟器时如何处理 TestFlight 中的检查点?