私は NSXMLParser を使用して、最終的に Core Data モデルにする必要がある大規模で複雑な XML ファイルを処理しています。これを行うために、Conway と Hillegass による iOS ブックで説明されているデザイン パターンに従っています。そこでは、新しいノードに到達するたびに NSXMLParser のデリゲートが変更され、新しいノードがその場で作成されます。エンティティを作成するために、解析中に新しいノードごとに MagicalRecord を使用MR_createEntity
してデータ モデルを設定しています。解析が終了したら、私は呼び出します
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
新しいエンティティをコア データ ストアに保存します。
最近、解析をバックグラウンド スレッドに移動することを決定するまで、これはすべて正常に機能します。そして、XML データが常にインポートされるとは限らないことに気付きました。MR_createEntity
したがって、いくつかのグーグル検索の後、バックグラウンドスレッドで使用すべきではないことがわかりました(リンク: https://github.com/magicalpanda/MagicalRecord/issues/298 )。
じゃあ何をすればいいの?考えられる解決策は 2 つあります。
解析中に、NSDictionaries と NSArray の混合である、すべてのノードの Foundation ベースの構造を作成するだけです。これは、バックグラウンド スレッドで実行できます。完了したら、メイン スレッドに戻り、データをコア データに保存し
MR_importValuesForKeysWithObject
ます。)。しかし、それは深くネストされた辞書と配列の組み合わせで機能しますか?解析中、 を呼び出す代わりに
MR_CreateEntity
、[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) { MyEntity *entity = [MyEntity MR_createInContext:localContext]; }];
上記のgithubリンクで提案されているように、新しいノードに遭遇するたびに.
では、コードの切り取りと変更を始める前に、どうすればよいのでしょうか? 多分別のアプローチがありますか?