0

私は 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 つあります。

  1. 解析中に、NSDictionaries と NSArray の混合である、すべてのノードの Foundation ベースの構造を作成するだけです。これは、バックグラウンド スレッドで実行できます。完了したら、メイン スレッドに戻り、データをコア データに保存しMR_importValuesForKeysWithObjectます)。しかし、それは深くネストされた辞書と配列の組み合わせで機能しますか?

  2. 解析中、 を呼び出す代わりにMR_CreateEntity

    [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext)
    {
        MyEntity *entity = [MyEntity MR_createInContext:localContext];
    }];
    

上記のgithubリンクで提案されているように、新しいノードに遭遇するたびに.

では、コードの切り取りと変更を始める前に、どうすればよいのでしょうか? 多分別のアプローチがありますか?

4

2 に答える 2

1

私が MagicalRecord のソース コードを正しく理解していれば、必要な呼び出しは1 つだけです。 saveInBackgroundWithBlock:completion:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
      // ... parse XML ...
      // ... create entities with:
      MyEntity *entity = [MyEntity MR_createInContext:localContext];
      // ...
} completion:^{
    NSLog("Import finished");
}];

これ

  • 一時的なバックグラウンド コンテキストを作成し、
  • そのコンテキストに関連付けられたバックグラウンド キューで最初のブロックを実行し、
  • MR_saveToPersistentStoreAndWait一時コンテキストをメイン コンテキスト保存し、メイン コンテキストを永続コアに保存する呼び出し、
  • 最後に完了ブロックを実行します。
于 2013-08-31T02:23:32.740 に答える