1

私はまだ RSS リーダーに取り組んでおり、ようやくまともな機能を実現しましたが、iPad 3 では UI の応答性が非常に悪いようです。

アプリを改善するために、インターネットで多くの情報源を調べたところ、Marcus Zarra のアプローチ (バックグラウンドで PSC への保存専用の親 MOC を持つ) に魅了されたこの興味深い宝石に出会いました。

Matthew Morey によって提供された例は見事に見えますが、1 つの操作しか考慮していません。それは、UITableView でのエントリの一括読み込みです。

このソリューションをアプリに実装しようとしましたが、明らかに混乱しています。私はMasterViewControllerを持っています。これは、開始時に一連のDBOperationオブジェクトを作成し、シリアル(最大1つの同時実行)NSOperationQueueに送信します。

私の UIViewControllers のそれぞれは、個別に保存する個々の CoreData 操作も実行します (投稿を編集としてマークし、カテゴリをオープンまたはクローズとしてマークするなど)。

だから、私の質問は次のとおりです。

  • アプリにマルチコンテキスト CoreData をどのように (一言で言えば) 実装する必要がありますか?
  • それぞれの UITableView をリロードするには、どのコントローラーがどのオブザーバーを追加する必要がありますか?
  • NSManagedObjectContextDidSaveNotification/mergechange 操作を監視するコントローラーまたはデリゲートはどれですか?

私はこれらすべてに本当に混乱しており、Markus Zarra の優れた本はほとんど役に立たなかった。

よろしくお願いいたします。

4

2 に答える 2

2
  • 基本的に、スレッドごとに 1 つの NSManagedObjectContext が必要です。

  • すべてのビュー コントローラーで使用されるメイン スレッド用のコンテキストを 1 つ作成します。ビューコントローラーでは、NSFetchedResultsController を使用できます。これは、データが変更されたときに通知され、テーブルビューの更新を自動的にトリガーできるためです。

  • すべてのバックグラウンド スレッドには、独自のマネージド オブジェクト コンテキストが必要です。このコンテキストは、そのバックグラウンド スレッドで作成する必要があります。例:

    NSManagedObjectContext *managedObjectConctext = [[[NSManagedObjectContext alloc] init] autorelease];
    [managedObjectConctext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    managedObjectConctext.undoManager = nil;
    managedObjectConctext.mergePolicy = NSOverwriteMergePolicy;
    
    return managedObjectConctext;
    
  • したがって、バックグラウンド スレッドは、このコンテキストを管理対象オブジェクトのフェッチ/更新にのみ使用する必要があります。したがって、最も重要なルールは、他のスレッドで管理対象オブジェクトにアクセスしないことです。(または、あるコンテキストで取得し、別のコンテキストで更新する...)

  • バックグラウンド コンテキストの各更新はメイン コンテキストとマージされるため、保存通知はメイン スレッドのコンテキストに実装する必要があります。これにより、View Controller がコンテンツを更新するようトリガーされます (適切な場合)。

于 2013-11-13T08:27:33.670 に答える
1

Marcus S. Zarra は、彼の優れた「Core Data 2nd Edition」の本(今年 Core-Data の本を 1 冊だけ購入する場合は、その本にしてください!) で私の質問に実際に答えています。

私がたまたま無視したのは、子/親の関係が MOC でどのように機能するかということでした。

MOC が親 MOC で宣言されているが、saveメソッドが呼び出されるたびに PSC が変更を親に「プッシュ」しないことを知りました。

メイン スレッドの MOC 自体がプライベートな「ライター」MOC の子であり、独自のプライベート キューを使用している場合、saveメイン MOC で非常に高速になり (ディスクは関係ありません)、プライベートでバックグラウンドで遅延する をカスケードできます。ライター MOC を使用して、GUI の応答性を維持します。

performBlockまた、MOC がプライベート キューを使用するときはいつでも、MOC はまたはperformBlockAndWaitブロック内でしかアクセスできないことも学びました。

助けてくれてありがとう、Leijonien、あなたは賛成票に値する!

于 2013-11-13T14:06:09.033 に答える