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 からコピーされることです。