最近一個項目是做金融的, 需要實時更新數(shù)據(jù), 首先想到最 Low 的方法就是每次都清空圖表上的所有數(shù)據(jù)進(jìn)行重繪, 不過每次消耗的 CPU 也很可觀, 也是仔細(xì)看了看 Charts, 在 ChartData 里面發(fā)現(xiàn)了
/// Removes the given Entry object from the DataSet at the specified index.
- (BOOL)removeEntry:(ChartDataEntry * _Null_unspecified)entry dataSetIndex:(NSInteger)dataSetIndex;
官方注釋說可以根據(jù) DataSet 的索引刪除某個條目的對象, 那么我們開始
需求是對某支股票的點進(jìn)行實時刷新, 也就是如果最后的一個點有更新, 我只需要把它從 ChartData? 刪掉, 再加上更新的數(shù)據(jù), 刷新 chartView 就可以了
下面是分時圖里部分代碼, 由于分時圖存在分時線和均線, 需要分別取出, 分別操作
// 判斷最后一個點是否有更新(是否刪除最后一個點)
if (isVover) {
// 拿到 chartView 的數(shù)據(jù)源
LineChartData *beforeLineData = _chartView.lineData;
// 找到 chartView 的數(shù)據(jù)集合
NSInteger indexLastDataSet = beforeLineData.dataSetCount - 2;// 分時
NSInteger averageIndexLastDataSet = beforeLineData.dataSetCount - 1;// 均線
// 根據(jù) Index? 找到 ChartData? 里面需要修改的 DataSet
LineChartDataSet *lastDataSet = (LineChartDataSet *)[beforeLineData getDataSetByIndex:indexLastDataSet];// 分時
LineChartDataSet *averageLastDataSet = (LineChartDataSet *)[beforeLineData getDataSetByIndex:averageIndexLastDataSet];// 均線
if (lastDataSet != nil) {
//? 根據(jù) DataSet? 找到最后一個點進(jìn)行刪除
ChartDataEntry *lastEntry = [lastDataSet entryForXIndex:lastDataSet.entryCount - 1];// 分時
ChartDataEntry *averageLastEntry = [averageLastDataSet entryForXIndex:averageLastDataSet.entryCount - 1];// 均線
[beforeLineData removeEntry:lastEntry dataSetIndex:indexLastDataSet];// 分時
[beforeLineData removeEntry:averageLastEntry dataSetIndex:averageIndexLastDataSet];// 均線
// 然后再創(chuàng)建兩個新的 Entry? 加到 Data
ChartDataEntry *dataEntry = [[ChartDataEntry alloc] initWithValue:priceValue/*傳來的現(xiàn)價*/? xIndex:lastDataSet.entryCount];
ChartDataEntry *averageDataEntry = [[ChartDataEntry alloc] initWithValue:averageValue/*傳來的均價*/ xIndex:averageLastDataSet.entryCount];
[beforeLineData addEntry:dataEntry dataSetIndex:indexLastDataSet];
[beforeLineData addEntry:averageDataEntry dataSetIndex:averageIndexLastDataSet];
// 最后要通知 chartView 對 DataSet? 進(jìn)行了更新
[_chartView notifyDataSetChanged];
}
}
除此之外, ChartData 里面還提供了
? 新增一個橫坐標(biāo)
- (void)addXValue:(NSString * _Nullable)xVal;
? 刪除一個橫坐標(biāo)
- (void)removeXValue:(NSInteger)index;
? 新增一組數(shù)據(jù)
- (void)addDataSet:(id_Null_unspecified)d;
? 刪除一組數(shù)據(jù)
- (BOOL)removeDataSet:(id_Null_unspecified)dataSet;
? 根據(jù)索引刪除一組數(shù)據(jù)
- (BOOL)removeDataSetByIndex:(NSInteger)index;
? 根據(jù) DataSet 索引和點在 DataSet 下的索引刪除一個點
- (BOOL)removeEntryByXIndex:(NSInteger)xIndex dataSetIndex:(NSInteger)dataSetIndex;
這些用法都大同小異, 只要清楚了解你要操作的數(shù)據(jù), 使用起來還是很方便的
下次我們再聊聊 MakerView 和 ValueFormatter
最后附一張成品
