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

私もこれを見ました。例外は、データ ソース関数を呼び出さずにグラフを描画するときに発生します。

x と y の値の数が一致しません
(
    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実行] + 470
    22 アプリキット 0x00007fff8806d244 NSApplicationMain + 867
    23 0x0000000100001a62 メイン + 34
    24 0x0000000100001a34 開始 + 52
)

私のアプリもマルチスレッド化されていますが、[thePlot setDataNeedsReloading] がメイン スレッドで呼び出されていることを確認し、すべてのデータ ソース コールバックがメイン スレッドで呼び出されていることを確認しました。

どういうわけか、CorePlot はデータを取得するために 2 つの呼び出しを行っていると確信しており、それらの 2 つの呼び出しの間にさらにデータを追加しているため、CorePlot は混乱しています。

于 2012-09-14T00:06:45.927 に答える
0
  1. ディクショナリとそのコンテンツへのすべてのアクセスgraphDataがスレッドセーフであることを確認してください。Core Plot は、データソースへのアクセスと描画をすべてメイン スレッドで行います。

  2. -reloadData-insertDataAtIndex:numberOfRecords:、およびその他の Core Plot メソッドを常にメイン スレッドから呼び出します。

于 2012-09-12T21:14:46.163 に答える