2013-05-30 178 views
1

我有以下CorePlot(v1.2)代碼,它基於http://www.raywenderlich.com/13271/how-to-draw-graphs-with-core-plot-part-2的教程,但擴展了一下。約30個數據點需要約3秒才能在iPhone 4S上呈現圖形。該圖確實加載,它只是緩慢。無論如何改善表現?CorePlot性能下降

這裏的輸出的NSLog形成的代碼:

2013-05-30 17:41:20.386 myApp[2796:907] A 
2013-05-30 17:41:20.387 myApp[2796:907] B 
2013-05-30 17:41:20.388 myApp[2796:907] C 
2013-05-30 17:41:20.389 myApp[2796:907] D 
2013-05-30 17:41:21.158 myApp[2796:907] E 
2013-05-30 17:41:21.160 myApp[2796:907] F 
2013-05-30 17:41:22.594 myApp[2796:907] G 

NB的代碼完成運行有圖形呈現之前關於另一0.5秒的延時之後。

,代碼:

-(void)configureAxes { 

    NSLog(@"A"); 
    // 1 - Create styles 
    CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle]; 
    axisTitleStyle.color = [CPTColor whiteColor]; 
    axisTitleStyle.fontName = @"Helvetica-Bold"; 
    axisTitleStyle.fontSize = 12.0f; 
    CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle]; 
    axisLineStyle.lineWidth = 2.0f; 
    axisLineStyle.lineColor = [CPTColor whiteColor]; 
    CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init]; 
    axisTextStyle.color = [CPTColor whiteColor]; 
    axisTextStyle.fontName = @"Helvetica-Bold"; 
    axisTextStyle.fontSize = 11.0f; 
    CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle]; 
    tickLineStyle.lineColor = [CPTColor whiteColor]; 
    tickLineStyle.lineWidth = 2.0f; 
    NSLog(@"B"); 
    // 2 - Get axis set 
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet; 

    // 3 - Configure x-axis 
    CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
    lineStyle.lineColor = [CPTColor whiteColor]; 
    lineStyle.lineWidth = 2.0f; 

    CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; 
    textStyle.fontName = @"Helvetica"; 
    textStyle.fontSize = 14; 
    textStyle.color = [CPTColor whiteColor]; 

    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0.0"); 
    axisSet.xAxis.minorTicksPerInterval  = 0; 

    NSLog(@"C"); 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    if ([person.unitPreference isEqualToString:@"US"]) { 
     [dateFormatter setDateFormat:@"MMM-dd"]; 
    } else { 
     [dateFormatter setDateFormat:@"dd-MMM"]; 
    } 
    NSLog(@"D"); 
    CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter]; 
    axisSet.xAxis.labelFormatter = timeFormatter; 
    axisSet.xAxis.labelRotation = M_PI/4; 
    axisSet.xAxis.titleOffset = 55.5f; 
    axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic;  
    NSLog(@"E"); 
    if ([measurementField isEqualToString:@"mWeight"]) { 
     NSString *unit; 
     if ([person.unitPreference isEqualToString:@"METRIC"]) { 
      unit = @"Kgs"; 
     } else if ([person.unitPreference isEqualToString:@"US"]) { 
      unit = @"lbs"; 
     } else { 
      unit = @"st lbs"; 
     } 
     axisSet.yAxis.title = [NSString stringWithFormat: @"Weight (%@)", unit]; 

     WeightFormatter *weightFormatter = [[WeightFormatter alloc] init]; 
     weightFormatter.person = person; 
     axisSet.yAxis.labelFormatter = weightFormatter; 
    } else if ([measurementField isEqualToString:@"mBodyFatPercentage"]) { 
     axisSet.yAxis.title = @"Body Fat %"; 
     axisSet.yAxis.labelFormatter = [[BodyFatPercentageFormatter alloc] init]; 
    } else { 
     NSString *unit; 
     if ([person.unitPreference isEqualToString:@"METRIC"]) { 
      unit = @"CMs"; 
     } else { 
      unit = @"Inches"; 
     } 
     axisSet.yAxis.title = [NSString stringWithFormat: @"Measurements (%@)", unit]; 

     MeasurementFormatter *measurementFormatter = [[MeasurementFormatter alloc] init]; 
     measurementFormatter.person = person; 
     axisSet.yAxis.labelFormatter = measurementFormatter; 
    } 
    NSLog(@"F"); 
    axisSet.yAxis.titleTextStyle = textStyle; 
    axisSet.yAxis.titleOffset = 40.0f + marginOffset; 
    axisSet.yAxis.axisLineStyle = lineStyle; 
    axisSet.yAxis.majorTickLineStyle = lineStyle; 
    axisSet.yAxis.minorTickLineStyle = lineStyle; 
    axisSet.yAxis.labelTextStyle = textStyle; 
    axisSet.yAxis.labelOffset = 3.0f; 
    axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat((yAxisMax-yAxisMin)/10.0f); 
    axisSet.yAxis.minorTicksPerInterval = 1; 
    axisSet.yAxis.minorTickLength = 5.0f; 
    axisSet.yAxis.majorTickLength = 7.0f; 
    axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; 
    axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(yAxisMin); 
    axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay); 
    NSLog(@"G"); 
} 
+0

您使用的是什麼版本的Core Plot?圖表最終顯示時圖表是否顯示正確? –

+0

謝謝埃裏克,我在1.2上,並且該圖確實呈現。我實際上最近從1.1升級到1.1,因爲我在iphone 5上遇到了問題。我可能會試着回滾,看看新版本是否引入了性能開銷。我在一段時間之前完成了所有這些代碼,並且不記得當時有任何性能問題,但是我的記憶很脆弱......我必須承認,我認爲它並不是由新版本引起的,但它似乎很合理。 – Lewis42

+0

1.2確實有一個問題,它有時可能會創建很多額外的軸標籤,從而放慢了一切。我沒有看到您發佈的代碼中可能引發問題的任何內容,但仍然有可能。如果您追蹤1.2版本的減速情況,請使用Mercurial獲取最新代碼以獲得修復。 –

回答

0

這是一件由coreplot 1.2推出。除其他下面的行會導致應用程序掛起很長一段時間:

axisSet.xAxis.labelRotation = M_PI/4; 
axisSet.xAxis.titleOffset = 55.5f; 

恢復到1.1解決了這個問題瞬間。從上面的@Eric Skroch的評論來看,這可能會在1.3版本中得到解決,但我想在此之前使用穩定版本,至少我沒有使用1.2中的任何新功能。

順便說一句,我認爲舊的存儲庫尚未與我的iPhone合作的原因5不具有以下到位:

  1. 添加到其它鏈接器標記您的目標構建設置:

    -ObjC -all_load

0

它關閉的政策是非常重要的,你你定製X之前,Y軸

CPTAxis *x = axisSet.xAxis; 

CPTAxis *y = axisSet.yAxis; 

x.labelingPolicy = CPTAxisLabelingPolicyNone; 
y.labelingPolicy = CPTAxisLabelingPolicyNone;