Я использую основную структуру графика для создания графика в реальном времени. Проблема в том, что через некоторое время он зависает на моем 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.