4

OK、Entity呼び出された .coreData モデルがありTechnicalQueryます。このような...

TechnicalQuery
--------------
NSString *detail
NSDate *createdDate
NSString *solution
NSString *name
...

アプリでは同期プロセス (アプリは仕様によりオフラインです) で、アプリを使用しているユーザーは、接続してオフィスに戻ったときに同期されます。とにかく、それは重要ではありません。

同じ名前を使用するNSManagedObjectためのサブクラスを作成しました。TechnicalQuery

詳細だけでなく、@property詳細も定義されてい@dynamicます。

現時点では、DB には技術クエリが 1 つしかありません。これは、アプリを使用してテクニカル クエリの「画面」を表示し、すべての詳細などを表示することで確認できます。名前、ソリューション、詳細、作成日などが表示されます。すべてが表示されます。

アプリでソリューション テキストを更新できます。その後、後で戻ったとき、更新はまだそこにあります。Core Data は正常に動作しています。

私の問題は、サーバーに同期するときに発生します。

デバッグでは、これは正常に機能します。同期プロセスをバックグラウンド スレッドにスローします。次に、このスレッドは、最後の同期以降に更新された TQ を探し、それらをJSONデータに変換します。次に、別のキューを開始し、これらの TQ のすべてのアップロードをキューに入れます。

ノート!ManagedObjectsスレッド間を通過することは決してありません。ある関数で fetchrequest を実行してから配列を保存し、次の関数 (同じスレッド) で配列を処理しています。次のスレッドに渡される唯一のものは、JSON送信する必要があるデータとオブジェクト固有の URL であり、CoreData オブジェクトはまったくありません。

JSON データは、ManagedObjectサブクラス ファイル内の関数によって収集されます (実際には のカテゴリにありますNSManagedObjectが、お分かりになると思います...)。この関数は、最初にオブジェクトをNSDictionaryサーバーが必要とする形式に一致する に変換し、次にそれを変換します。

とにかく、デバッグ モード (つまり、Xcode から iPhone 5 に直接実行) では正常に動作します。辞書 (およびアップロード データはすべて正常に読み込まれます)。

ただし、(最終的に到達した) リリース モードで実行している場合 (つまり、インストゥルメントでプロファイルを作成している場合)、NSDictionary を生成する関数が爆発します。プロパティ「detail」がnilであることを教えてくれます。プロパティをNSLog表示すると、(リリース モードでは) nil であることがわかりますが、(デバッグ モードでは) テキストが表示されます。

<Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail)

私はこれが起こっている正確な行を知っていますNSMutableDictionary.

通常、私はどこかにプロパティを設定していないことを確認しますが、TQページを再度参照すると詳細テキストが正しく表示されるので、間違いなく設定されています!?

今どこに行けばいいのか本当にわかりません。

誰かがどこを見るべきかなどのアドバイスを提供できれば、それは素晴らしいことです.

::編集1::

OK、これは奇妙です。

データを収集して処理するオブジェクトに強力なプロパティ配列 (recordArray と呼ばれる) があります。

との2つの機能がcollectDataありprocessArrayます。関数はフェッチ要求を実行し、collectData結果を recordArray に入れます。次に、processArray関数は配列を反復し、各項目を処理します。

配列にデータを記録すると、collectDataすべて正しく表示されます。

同じ配列から同じデータをログに記録するとprocessArray、オブジェクトはまだ配列にありますが、プロパティはすべて null です。

ありがとう

::編集2::

プロパティ配列を取り除き、入出力パターンに置き換えてみました。

つまり、collectData 関数から配列を出力し、それを processArray 関数に入力します。

それでも同じ結果が得られました。

本当にこれで私の髪を引っ張ります。

再度、感謝します

::編集3::

NSLog エントリからいくつかのコンソール ログを追加するだけです。

1. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Collecting technical queries
2. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone.
3. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: pushing tech queries
4. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Tech Query: Name: (null) Detail: (null)
5. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: (null)
6. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail)
7. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Something Went Wrong!

これらすべてが 1 秒未満で行われていることがわかります。

行 2 は、collectData 関数内からの Tech Query の名前と詳細プロパティの NSLog です。

行 4 は、processArray 関数内からの Tech Query の名前と詳細プロパティの NSLog です。

ご覧のとおり、4 行目はプロパティの null 値を示しています。

行 6 は、detail プロパティを NSMutableArray に追加しようとしたときの例外ログです。detail プロパティが null であるため、問題が発生しました。

::編集4::

スレッド ID を使用してログを追加します。

1. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Collecting technical queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
2. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
3. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: pushing tech queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
4. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: (null) Detail: (null) Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8}
5. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: (null)
6. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail)
7. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Something Went Wrong!

ここから、スレッド間で何も渡していないことがわかります。これはすべて同じスレッドで発生しています。

再度、感謝します。

::編集5::

私がこれを作っていないことを示すために、ここにデバッグビルドのログがあります...

1. 2012-11-29 10:36:08.471 [2767:161f] Collecting technical queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
2. 2012-11-29 10:36:08.474 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
3. 2012-11-29 10:36:08.474 [2767:161f] pushing tech queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
4. 2012-11-29 10:36:08.475 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8}
5. 2012-11-29 10:36:08.476 [2767:161f] Test description from Olivers iPhone.
6. 2012-11-29 10:36:08.483 [2767:1623] Uploading to url <I can't put the URL here as it's private>
7. 2012-11-29 10:36:08.906 [2767:520f] Upload Done

これはまったく同じコードです。唯一の違いは、これがデバッグ モードで実行され、ログがオーガナイザー デバイス ログではなく Xcode からコピーされることです。

4

3 に答える 3

3

あなたの問題が何であるかを正確にお答えすることはできませんが、この問題が発生し、非メイン スレッドが管理対象オブジェクト コンテキストを最適化された状態に維持していないことが判明しました。現在の NSThread の threadDictionary を使用することで、スレッドのライフサイクルを通じて管理対象オブジェクトのコンテキストを維持し、問題を解決しました。

于 2013-05-29T10:34:39.540 に答える
1
于 2012-11-29T21:22:44.197 に答える
0

フォグマイスター、

あなたは私たちに多くの情報を提供していません。そのため、誰もが推測するでしょう。

まず、コードのリリース バージョンをデバッグできます。Xcode スキームの構成プロファイルを変更するだけです。

第二に、リリース モードに切り替えると、コードはどのように変化しますか? デバッグ コンパイル時のフラグを変更すると、製品が変更されるのはなぜですか。(DEBUG フラグをスローしても Core Data は変更されないため、問題になる可能性はほとんどありません。)

さらに支援するために、SO コミュニティは通常、何らかのコードを確認する必要があります。いくつかを共有すると、人々はおそらくあなたを助けるためにそれを見ます.

アンドリュー

于 2012-11-29T12:36:50.183 に答える