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