2017-10-30 3 views
0

大きなXMLファイルを読み取るのにNSXMLParserを使用しています。データ要素を取得したら、NSManagedObjectを作成し、バックグラウンドで保存します。インポートされたファイルにはn個のインポートされたアイテムがあります。これは決して知られていません。 XMLファイルを読み込む行われ、すべての私のCore Dataのオブジェクトが保存完了したときコアデータがNSXMLParserを使用してすべてのエンティティを保存したときを知る

NSManagedObjectContext *backgroundContext = [ZSSCoreDataManager sharedService].persistentContainer.newBackgroundContext; 
[backgroundContext performBlock:^{ 

    // Create and insert new entity here 
    [self createAndInsertWithDictionary:object]; 

    // Save 
    if ([backgroundContext hasChanges]) { 
     NSError *error = nil; 
     if (![backgroundContext save:&error]) { 

      NSLog(@"%@", error); 

     } 

     // Save was successful, reset to release memory 
     [backgroundContext reset]; 

    } 

}]; 

構文解析が完了することができます​​より速く起こる可能性があるためには、どのように私が知っていることができますか?私はparserDidEndDocument:メソッドを知っていますが、これは私のオブジェクトのすべてがCore Dataに保存を完了したことを知るのに役立ちません。

アイデア?

答えて

1

performBlockperformBlockAndWaitに置き換えると、ブロックが完了して保存が完了したことを知ることができます。

待機したくない場合は、ディスパッチグループのジョブのように思えます。そうすれば、一連の非同期コードが終了した後にのみ関数を呼び出すようにスケジューリングすることができます。

  • dispatch_group_create
  • とディスパッチグループにあなたがこれらのブロックのいずれかを起動するたびに作成し、何かを行う前にdispatch_group_enterを呼び出します。
  • 保存が完了するたびに、すべての「去る」ことで一致した「と入力します」場合にのみ実行されるブロックをスケジュールするために使用dispatch_group_notifydispatch_group_leave
  • を呼び出します。

「通知」ブロックに、保存が完了するたびに1回実行するコードを挿入します。

+0

私はディスパッチグループパターンをかなり使用しましたが、この状況では、 'dispatch_group_enter'が生成された後に' dispatch_group_enter'が呼び出され、別の 'dispatch_group_enter'が作成される前に非常に素早く保存されると、したがって、 'dispatch_group_notify'を呼び出すことができます。私はこれについて間違っていますか? –

+0

ちょうどこれをテストし、すぐに 'dispatch_group_notify'を起動します。他のアイデア? –

+1

ええ、プロセスを開始する前に "入力"を追加してください。 'parserDidEndDocument'に" leave "を追加します。パーザが終了する前にnotifyブロックを呼び出すことはできません。 –

関連する問題