1

我无法找到有关此的大量信息,并且我以任何方式都没有运气,我试图缩小这个问题的来源,所以我希望这里有人可以给我更多信息和潜力导致我可能会收到此错误。

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

完全错误:由于未捕获的异常而终止应用程序'CPTException', reason: 'Number of x and y values do not match'

我在崩溃前查看了我的数据集,我确保我的点创建从未失败过,也没有任何问题。我猜此时这与我的散点图版本有关,可能在 numberOfRecordsForPlot 函数中。但是,它似乎并没有在该功能的任何地方崩溃。崩溃通常在 10 多秒后才会发生,但它再次不一致,并且在它崩溃并且正在完美地工作绘图之前。

非常感谢人们对此有所了解。

PS:如果人们想看代码,请告诉我,任何非标准的我已经验证可以尽我所能发挥作用,与散点图有关的任何事情都是相当标准的。

-(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];
}

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

4

2 回答 2

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

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

于 2012-09-12T21:14:46.163 回答
0

我也看到了这个。绘制图形时发生异常,而不是调用任何数据源函数。

x 和 y 值的数量不匹配
(
    0 核心基础 0x00007fff88f4df56 __exceptionPreprocess + 198
    1 libobjc.A.dylib 0x00007fff851cfd5e objc_exception_throw + 43
    2 核心基础 0x00007fff88f4dd8a +[NSException raise:format:arguments:] + 106
    3 核心基础 0x00007fff88f4dd14 +[NSException raise:format:] + 116
    4 CorePlot 0x0000000100027c31-[CPTScatterPlot renderAsVectorInContext:] + 561
    5 CorePlot 0x000000010004dd50 -[CPTLayer drawInContext:] + 96
    6 核心绘图 0x000000010001d023 -[CPTPlot drawInContext:] + 99
    7 石英核心 0x00007fff8a673701 CABackingStoreUpdate_ + 3221
    8 石英核心 0x00007fff8a672616 _ZN2CA5Layer8display_Ev + 1086
    9 石英核心 0x00007fff8a66a4e6 _ZN2CA5Layer17display_if_neededEPNS_11TransactionE + 560
    10 石英核心 0x00007fff8a66949b _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 319
    11 石英核心 0x00007fff8a669218 _ZN2CA11Transaction6commitEv + 274
    12 石英核心 0x00007fff8a668819 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 63
    13 核心基础 0x00007fff88f0d8e7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    14 核心基础 0x00007fff88f0d846 __CFRunLoopDoObservers + 374
    15 核心基础 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 运行] + 470
    22 AppKit 0x00007fff8806d244 NSApplicationMain + 867
    23 0x0000000100001a62 主要 + 34
    24 0x0000000100001a34 开始 + 52
)

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

我敢肯定,CorePlot 以某种方式进行了两次调用来获取我的数据,并且我在这两次调用之间添加了更多数据,CorePlot 很困惑。

于 2012-09-14T00:06:45.927 回答