核心图:异常'x和y值的数量不匹配'

时间:2012-09-07 21:43:49

标签: objective-c ios core-plot

我无法找到有关这方面的大量信息,我无论如何都没有运气,我试图缩小这个问题的来源,所以我希望有人可以给我一点点我可能会收到此错误的信息和潜在线索。

我正在实时绘制数据集,因为通过不断接收新数据,数据集不断增加。当我收到新数据时,我花时间将其作为x接收,将值本身作为y,这就是我生成点数的方式。

完全错误:因未捕获的异常'CPTException', reason: 'Number of x and y values do not match'

而终止应用

我在崩溃前查看了我的数据集,我已经确定我的创建点永远不会失败并且没有任何问题。我猜这点与我的Scatter Plot版本有关,可能在numberOfRecordsForPlot函数中。然而,它似乎没有在该功能中的任何地方崩溃。直到通常10秒以上才会发生崩溃,但是它再次不一致,并且在它崩溃之前并且正在完美地进行绘图。

非常感谢任何光明人士对此表示赞赏。

PS:如果人们想要查看代码,请告诉我什么,我已经验证的任何非标准功能都是尽我所能,并且与Scatter Plot有关的任何事情都是相当标准的。

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot 
{
    //Translation: The array with key of the top of the first selected parameter
    NSInteger curCount = [self.graphParams count];
    NSLog(@"Current Count: %d", curCount);

    if ([plot.identifier isEqual:@"Sel_1"] && (curCount >= 1) ) {
        if ([self.graphParams objectAtIndex: 0] != nil) {
            //NSString *myText = ((UITableViewCell *)[self.graphParams objectAtIndex: 0]).textLabel.text;
            //NSInteger myNum = [[self.graphData objectForKey: myText] count];
            //return [[self.graphData objectForKey: myText] count];
            //return [[self.graphData objectForKey: ((UITableViewCell *)[self.graphParams objectAtIndex: 0]).textLabel.text] count];
            return [[self.graphData objectForKey: [self.graphParams objectAtIndex: 0]] count];
        }
        else 
            return 0;  
    }
    else if ([plot.identifier isEqual:@"Sel_2"] && (curCount >= 2) ) {
        if ([self.graphParams objectAtIndex: 1] != nil)
            //return [[self.graphData objectForKey: ((UITableViewCell *)[self.graphParams objectAtIndex: 1]).textLabel.text] count];
            return [[self.graphData objectForKey: [self.graphParams objectAtIndex: 1]] count];
        else 
            return 0;
    }
    else if ([plot.identifier isEqual:@"Sel_3"] && (curCount >= 3) ) {
        if ([self.graphParams objectAtIndex: 2] != nil)
            //return [[self.graphData objectForKey: ((UITableViewCell *)[self.graphParams objectAtIndex: 2]).textLabel.text] count];    
            return [[self.graphData objectForKey: [self.graphParams objectAtIndex: 2]] count];
        else
            return 0;
    }

    return 0;
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
    //Translation: The array with key of the top of the first selected parameter
    NSValue *value = nil;

    if ( [plot.identifier isEqual:@"Sel_1"] ) {
        value = [[self.graphData objectForKey: [self.graphParams objectAtIndex:0]] objectAtIndex:index];
    }
    else if ( [plot.identifier isEqual:@"Sel_2"] ) {
        value = [[self.graphData objectForKey: [self.graphParams objectAtIndex: 1]] objectAtIndex:index];    
    }
    else if ( [plot.identifier isEqual:@"Sel_3"] ) {
        value = [[self.graphData objectForKey: [self.graphParams objectAtIndex: 2]] objectAtIndex:index];    
    }

    if (value != nil)
    {
        CGPoint point = [value CGPointValue];
        if ( fieldEnum == CPTScatterPlotFieldX )
            return [NSNumber numberWithFloat:point.x];
        else if ( fieldEnum == CPTScatterPlotFieldY )
            return [NSNumber numberWithFloat:point.y];
    }

    return [NSNumber numberWithFloat:0];
}

编辑:发布一些散点图代码,我认为错误可能来自,但我不知道这对你们任何人有多大用处。一如既往地评论其他请求,我很乐意提供任何有意义的内容。

2 个答案:

答案 0 :(得分:0)

  1. 确保对graphData字典及其内容的所有访问都是线程安全的。 Core Plot在主线程上完成所有数据源访问和绘图。

  2. 始终从主线程中调用-reloadData-insertDataAtIndex:numberOfRecords:和其他Core Plot方法。

答案 1 :(得分:0)

我也见过这个。绘制图形时不会调用任何数据源函数。

Number of x and y values do not match
(
    0   CoreFoundation                      0x00007fff88f4df56 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff851cfd5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff88f4dd8a +[NSException raise:format:arguments:] + 106
    3   CoreFoundation                      0x00007fff88f4dd14 +[NSException raise:format:] + 116
    4   CorePlot                            0x0000000100027c31 -[CPTScatterPlot renderAsVectorInContext:] + 561
    5   CorePlot                            0x000000010004dd50 -[CPTLayer drawInContext:] + 96
    6   CorePlot                            0x000000010001d023 -[CPTPlot drawInContext:] + 99
    7   QuartzCore                          0x00007fff8a673701 CABackingStoreUpdate_ + 3221
    8   QuartzCore                          0x00007fff8a672616 _ZN2CA5Layer8display_Ev + 1086
    9   QuartzCore                          0x00007fff8a66a4e6 _ZN2CA5Layer17display_if_neededEPNS_11TransactionE + 560
    10  QuartzCore                          0x00007fff8a66949b _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 319
    11  QuartzCore                          0x00007fff8a669218 _ZN2CA11Transaction6commitEv + 274
    12  QuartzCore                          0x00007fff8a668819 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 63
    13  CoreFoundation                      0x00007fff88f0d8e7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    14  CoreFoundation                      0x00007fff88f0d846 __CFRunLoopDoObservers + 374
    15  CoreFoundation                      0x00007fff88ee24a2 CFRunLoopRunSpecific + 258
    16  HIToolbox                           0x00007fff8d59c4d3 RunCurrentEventLoopInMode + 277
    17  HIToolbox                           0x00007fff8d5a3781 ReceiveNextEventCommon + 355
    18  HIToolbox                           0x00007fff8d5a360e BlockUntilNextEventMatchingListInMode + 62
    19  AppKit                              0x00007fff87df4e31 _DPSNextEvent + 659
    20  AppKit                              0x00007fff87df4735 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
    21  AppKit                              0x00007fff87df1071 -[NSApplication run] + 470
    22  AppKit                              0x00007fff8806d244 NSApplicationMain + 867
    23                            0x0000000100001a62 main + 34
    24                            0x0000000100001a34 start + 52
)

我的应用程序也是MultiThreaded,但我确保在主线程中调用[thePlot setDataNeedsReloading],并确保在主线程中调用所有数据源回调。

我确信,不知何故,CorePlot正在进行两次调用以获取我的数据,并且我在这两次调用之间添加了更多数据,并且CorePlot很困惑。