0

すべてのデータがダウンロードされてcoreDataに挿入された後、NSFetchedResultsControllerDelegateを使用してセルを表示します。以下のコードを使用して、変更がいつ発生したかを確認します

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshDatas:) name:NSManagedObjectContextDidSaveNotification object:nil];

次に、このメソッドが呼び出されます

- (void)refreshDatas:(NSNotification *)notification
{
    [[self.fetchedResultsController managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

しかし、問題があります。デリゲートNSFetchedResultsControllerDelegateのinsertRowAtIndexPathの最初の呼び出しとUITableViewに挿入されたセルの表示の間に、5〜10秒あり、理由がわかりません。

ご協力いただきありがとうございます

4

1 に答える 1

1

バックグラウンドスレッドを使用していて、そこで通知が発生する場合は、次のようにメインスレッドで通知を「再公開」する必要があります。

- (void)refreshDatas:(NSNotification*)notification
{
  if ([notification object] == [self managedObjectContext]) return;

  if (![NSThread isMainThread]) {
      [self performSelectorOnMainThread:@selector(refreshDatas:) withObject:notification waitUntilDone:YES];
      return;
  }

  [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}

これが問題ではない場合は、質問に詳細を追加してみてください。コアデータは難しく、詳細がなければ何が起こっているのかを理解することは困難です。

編集

[notification object](この場合はコンテキスト)がメインの場合、変更をマージしません。逆に、そのコンテキストが別のスレッドからのものである場合は、変更をマージします。これはパフォーマンス上の理由によるものですが、単に削除することもできます。

お役に立てば幸いです。

于 2012-10-03T15:41:44.827 に答える