Charts 進(jìn)階

最近一個項目是做金融的, 需要實時更新數(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

最后附一張成品


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容