0

アプリケーション内で(Core Dataの軽量移行を使用して)推測されたマッピングモデルを作成すると、ランダムにクラッシュします。ちなみに、実行中にアプリケーションでプログラムで実行する必要があります。

これが私がこのモデルを作成する方法です(もちろん、適切なcurrentModelオブジェクトとnewModelオブジェクトを作成した後):

NSMappingModel * mappingModel = [NSMappingModel inferredMappingModelForSourceModel:currentModel destinationModel:newModel error:&error];

問題はこれです:このメソッドはランダムにクラッシュします。それが機能するとき、それは問題なくうまく機能します。しかし、クラッシュすると、アプリケーションがクラッシュします(メソッドが失敗したことを示すためにnilを返す代わりに)。ランダムとは、時々それが起こることもあれば起こらないことも意味します。予測できません。

さて、これが取引です:私はこのメソッドを別のスレッドで実行しています。より正確には、グローバルメインキューで実行するためにGCDを介して渡されるブロック内にあります。UIをユーザーに鮮明に表示するには、これを行う必要があります。つまり、作業の進行中に進行状況インジケーターを表示できるようにするためです。

奇妙なことに、GCDを削除してメインスレッドで実行すると、正常に動作し、クラッシュすることはないようです。したがって、これがクラッシュしているのは、これを別のスレッドで実行しているためでしょうか?

マルチスレッドに関するCoreDataのルールに違反しているとは思わないので、どういうわけかそれは奇妙だと思います。特に、管理対象オブジェクトを渡さず、MOCにアクセスする必要があるときはいつでも、新しいMOCを作成します。つまり、以前に作成されたMOC(またはさらに言えば何でも)に依存しません。メインスレッドに。発生する小さなMOCに加えて、マッピングモデルの作成方法の後、つまりアプリがクラッシュした時点のに発生するため、ここで検討しているクラッシュの原因となる可能性はありません。

私がしているのは、2つのMOMを取得し、それらの間のマッピングモデルを要求することだけです。糸脱毛の下でもそれは間違いではありません、今それはできますか?

何が起こっているのかについてのアイデアはありますか?

4

2 に答える 2

0

まず、クラッシュとは何ですか?

次に、CoreDataは通常シングルスレッドAPIです。複数のスレッドで実行できることがありますが、を作成することNSMappingModelはおそらくそれらの1つではありません。マッピングモデルを動的に作成する必要があるのはなぜですか?MOMが既知の数量である場合、マッピングも既知の数量である可能性があります。

アップデート

まず、スレッドの問題です。CoreDataはシングルスレッドであることが意図されています。ただし、正しくNSManagedObjectContextロックする方法を知っているため、正しくロックする方法を知っているため、スレッドごとNSPersistentStoreCoordinatorに1つ持つことができます。NSManagedObjectContextただし、これは、マッピングモデルを使用して作成している場合には当てはまりません。

ただし、提供したエラー自体はCoreDataエラーではありません。このエラーは、コードのどこかでnilをセットに貼り付けようとしていることを示しています。正確な場所を推測することは困難ですが、マッピングモデルを生成しているコードを見ずに。

objc_throw_exceptionにブレークポイントを設定し、コードのどの行がこのクラッシュを引き起こしているのかを確認しましたか?それが自明でないものである場合は、マッピングモデルの構築に、CoreDataに予期しないゼロを与えるポイントがあることをお勧めします。

試すことができることの1つは、NSPersistentStoreおよび/またはNSManagedObjectContext自分自身をロックして、クラッシュが解決するかどうかを確認することです。ただし、そうすると、パフォーマンスの問題に再び対処することになります。

于 2010-03-22T02:14:30.633 に答える
0

私は結局この問題を完全に諦め、自分でひどいマッピングモデルを作成しました。

于 2011-06-03T01:36:53.770 に答える