Основной график IOS в реальном времени - PullRequest
0 голосов
/ 06 мая 2011

Я использую основную структуру графика для создания графика в реальном времени. Проблема в том, что через некоторое время он зависает на моем iphone. Я думаю, это из-за большого количества данных, и я перезагружаю их каждый раз, когда получаю новые данные. Мне нужно решение этого. Я хотел установить таймер и перезагружать каждые 5 секунд или около того или, возможно, использовать параллельный поток. Что мне делать. Спасибо.

Я имею в виду, может быть, 2-3000.

Вот мой код:

//graph1 init
CGRect graphRect = CGRectMake(0, 0, 320, 183);
graph=[[CPXYGraph alloc] initWithFrame:graphRect];

CPGraphHostingView *graphView = (CPGraphHostingView*)graphViewScroll;
graphView.hostedGraph = graph;

graph.paddingLeft = 20.0;
graph.paddingTop = 20.0;
graph.paddingRight = 20.0;
graph.paddingBottom = 20.0;

CPXYPlotSpace *plotSpace = (CPXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.xRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0)
                                               length:CPDecimalFromFloat(17)];
plotSpace.yRange = [CPPlotRange plotRangeWithLocation:CPDecimalFromFloat(0)
                                               length:CPDecimalFromFloat(25)];


CPMutableLineStyle *lineStyle = [CPMutableLineStyle lineStyle];
lineStyle.lineWidth = 1.5f;
lineStyle.lineColor = [CPColor whiteColor];



CGRect speedframe=CGRectMake(305,70, 50, 15);


UILabel *speedlabel=[[UILabel alloc]initWithFrame:speedframe];
speedlabel.text=@"Speed";
speedlabel.backgroundColor=[UIColor clearColor];
speedlabel.textColor=[UIColor whiteColor];
speedlabel.transform = CGAffineTransformMakeRotation( M_PI/2 );


CGRect metersframe=CGRectMake(615,80, 70, 15);


UILabel *meterslabel=[[UILabel alloc]initWithFrame:metersframe];
meterslabel.text=@"Meters";
if([distance1 isEqualToString:@"miles"]) {
    meterslabel.text=@"Feet";
}

meterslabel.backgroundColor=[UIColor clearColor];
meterslabel.textColor=[UIColor whiteColor];
meterslabel.transform = CGAffineTransformMakeRotation( M_PI/2 );

CGRect speedframe1=CGRectMake(450,165, 90, 15);


UILabel *timelabel=[[UILabel alloc]initWithFrame:speedframe1];

timelabel.text=@"Time";
timelabel.backgroundColor=[UIColor clearColor];
timelabel.textColor=[UIColor whiteColor];
//timelabel.transform = CGAffineTransformMakeRotation( M_PI/2 );

CGRect kmframe=CGRectMake(770,165, 90, 15);


UILabel *kmlabel=[[UILabel alloc]initWithFrame:kmframe];
kmlabel.text=@"Km";
if([distance1 isEqualToString:@"miles"]) {
    kmlabel.text=@"Miles";
}
kmlabel.backgroundColor=[UIColor clearColor];
kmlabel.textColor=[UIColor whiteColor];

CPXYAxisSet *axisSet = (CPXYAxisSet *)graph.axisSet;
axisSet.xAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue];
axisSet.xAxis.minorTicksPerInterval = 4;
axisSet.xAxis.majorTickLineStyle = lineStyle;
axisSet.xAxis.minorTickLineStyle = lineStyle;
axisSet.xAxis.axisLineStyle = lineStyle;
axisSet.xAxis.minorTickLength = 5.0f;
axisSet.xAxis.majorTickLength = 7.0f;

//axisSet.xAxis.axisTitle=@"Test";
//axisSet.xAxis.axisLabelOffset = 3.0f;

axisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"3"] decimalValue];
axisSet.yAxis.minorTicksPerInterval = 4;
axisSet.yAxis.majorTickLineStyle = lineStyle;
axisSet.yAxis.minorTickLineStyle = lineStyle;
axisSet.yAxis.axisLineStyle = lineStyle;
axisSet.yAxis.minorTickLength = 5.0f;
axisSet.yAxis.majorTickLength = 7.0f;
//axisSet.yAxis.axisLabelOffset = 3.0f;

CPScatterPlot *xInversePlot = [[[CPScatterPlot alloc] init] autorelease];
xInversePlot.identifier = @"X Inverse Plot 1";
lineStyle = [[xInversePlot.dataLineStyle mutableCopy] autorelease];
lineStyle.lineWidth = 1.0f;
lineStyle.lineColor = [CPColor whiteColor];
xInversePlot.dataLineStyle = lineStyle;
xInversePlot.dataSource = self;
[graph addPlot:xInversePlot];

//graph1 end

У меня есть две диаграммы. Здесь я помещаю данные в график:

-(NSUInteger)numberOfRecordsForPlot:(CPPlot *)plot{
if(plot.identifier == @"X Inverse Plot 2") {
    return [contentArray count];
}
else {
    return [dataForPlot count];
}
 }

 -(NSNumber *)numberForPlot:(CPPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{

//NSLog(@"numar:%@",num);
if(plot.identifier == @"X Inverse Plot 2") {
    NSLog(@"X Inverse Plot 2");
     NSNumber *num = [[self.contentArray objectAtIndex:index] valueForKey:(fieldEnum == CPScatterPlotFieldX ? @"x" : @"y")];
    return num;
}
else {
      NSNumber *num = [[self.dataForPlot objectAtIndex:index] valueForKey:(fieldEnum == CPScatterPlotFieldX ? @"x" : @"y")];
    return num;
}
}

И я перезагружаю данные каждый раз, когда получаю новые данные от GPS.

1 Ответ

0 голосов
/ 07 мая 2011

См. в этой теме на доске обсуждений Core Plot, где вы найдете некоторые идеи по улучшению производительности при загрузке данных.

Я бы рекомендовал не пытаться загружать данные в отдельный поток.Базовый график не предназначен для многопоточности, и другие пользователи сообщали о проблемах при этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...