1

Core Data ストアに対するフェッチ リクエストの結果をループしています。結果リスト内のオブジェクトごとに、文字列型のいくつかの属性を読み取り、それらを 1 つの文字列に連結しています (CSV 形式のファイルとして出力します)。

データセット内の特定のレコードの特定の文字列が原因で問題が発生しています。不要な文字 (漢字、アラビア語など) が文字列の末尾に追加され、結果の文字列に正しく追加されず、CSV ファイル形式がホース。

フェッチ結果をループして文字列を追加するための私のコードは次のとおりです。

NSMutableString *reportString = [[NSMutableString stringWithFormat:@"...\n"];
for (int s = 0; s < [frc.sections count]; s++) {
    for (int r = 0; r < [[frc.sections objectAtIndex:s] numberOfObjects]; r++) {
        NSIndexPath *i = [NSIndexPath indexPathForRow:r inSection:s];
        Thread *thread = [frc objectAtIndexPath:i];
        NSMutableString *activity = [NSMutableString stringWithString:[thread activity]];
        .
        .
        .
        [reportString appendString:activity];
        [reportString appendFormat:@",%@\n", client];
    }
}

ここではstringWithStringを使用していますが、他のいくつかの文字列メソッドも使用しており、同様の破損した結果が得られます。ある時、アラビア文字が現れました。別の時は"...random...FSO_CARRIER_ATT@2X.png"でした。また、(フェッチされた結果コントローラーの代わりに) 別のフェッチ結果配列を使用してみました。

奇妙なことの 1 つは、lldb からPOを実行すると、文字列が正しく表示されることです。これは、文字列をマッシュアップしようとしているときに、この「破損」がテーブル ビューに表示されない理由を説明している可能性があります。

私の質問

Core Data モデルから文字列値を間違ってコピーしたために、この問題が発生していますか? 私が見逃しているテクニックはありますか?

アップデート:

監視対象の変数と値の NSLog のスクリーンショット:

スクリーンショット 2

4

2 に答える 2

1

コメントで述べたように、これは文字列のエンコード/デコードの問題であることが判明しました。

私はより直接的な質問 ( NSString で Unicode 文字を適切にエンコードするにはどうすればよいですか? ) を作成し、すぐに答えを得ました。

基本的に、ここにいる全員が同意するように、適切な文字列操作方法を使用していました。結局、CSV ファイルをメールに添付するために使用していたエンコーディング パラメータが正しくありませんでした。同時に、Xcode の変数ペインと lldb ペインの不一致は正当なバグのようです。私はそのバグレポートを提出します。

于 2013-04-18T09:36:38.627 に答える
-1

この反復コード全体を 1 つのシリアル バックグラウンド スレッドに入れます。入力の順序の破損は、スレッドが互いに競合していることに確かに関係しています。別のスレッドを使用することもできますが、それらが連続して実行されるようにする必要があります。つまり、1 つのスレッドが以前にスケジュールされたスレッドの終了を待機するようにします。

Grand Central Dispatch では、これは次のようなスレッドになります。

dispatch_queue_t serialThread = 
   dispatch_queue_create("serialThread", DISPATCH_QUEUE_SERIAL); 

管理オブジェクトコンテキストを使用することもできます

[context performBlockAndWait:...];
于 2013-04-04T13:53:55.827 に答える